2016-07-05 11 views
0

Rの意味と文法を理解するのに苦労しています。ローカル変数は関数内で変更することはできません。R内の関数内で非グローバル変数を変更できますか?

たとえば、この基本コードでは、foo()関数を呼び出すと、heatmap.matrix変数が更新されることが予想されます。

heatmap.matrix <- matrix(rep(0,40000), nrow=200, ncol=200) 

# foo function should just update a single cell of the declared matrix 
foo <- function() { heatmap.matrix[40,40] <- 100} 

heatmap.matrix[40,40] 
[1] 0 
foo() 
heatmap.matrix[40,40] 
[1] 0 
# there I expected it to return 100. Yet if I do it out of the function: 
heatmap.matrix[40,40] <- 100 
[1] 100 

これは、関数がを評価した後、変数の範囲が戻されていないことを信じて私をリードしています。 これはRの場合ですか?他に何か起こっていますか?私は本当に何が起こっているのにハングアップしていないように感じる。どんな助けや洞察力も本当にありがとう!

私のコードでは、周波数表にxyという列があり、頻度表のエントリに対応する値を持つ2次元行列に変換しようとしていますが、対応するエントリがない場合はゼロを返します。しかし、私はapply関数内で行列を変更できません。

+2

です。二重代入演算子 '<< - 'は関数外の変数を修正するために使用されます。また、[functions](http://adv-r.had.co.nz/Functions.html)を読んで、lexical scoping – SymbolixAU

+3

'foo()'は 'heatmap.matrix'のコピーをとり、それを内部で修正します関数。グローバル 'heatmap.matrix'は変更されません。多くの場合、Rはオブジェクトのコピーをとり、変更を加えた後、 'foo < - function(){heatmap.matrix [40,40] < - 100; heatmap.matrix} ' – thelatemail

+2

ローカル環境の外部に' << - 'を付けることはできますが、一般に悪い形式です。変更されたオブジェクトを返すほうがよいので、コードから変数を再割り当てしていることは明らかで、目に見えない変更はありません。 '<< - 'はまたあなたの構造や変数名(そして他の親環境のもの)によっては、意図した場所を割り当てられないかもしれないので、あなたにバグや悪いことにあなたが関数を与えたソースコードを持っていない人 – alistaire

答えて

1

getおよびassign関数を使用してグローバル変数を更新することは可能です。以下は、同じことを行うコードです:

heatmap.matrix <- matrix(rep(0,40000), nrow=200, ncol=200) 

# foo function should just update a single cell of the declared matrix 
varName <- "heatmap.matrix" 
foo <- function() { 
    heatmap.matrix.copy <- get(varName) 
    heatmap.matrix.copy[40,40] <- 100 
    assign(varName, heatmap.matrix.copy, pos=1) 
} 

heatmap.matrix[40,40] 
#[1] 0 
foo() 
heatmap.matrix[40,40] 
# [1] 100 

環境コンセプトで少し読んでください。開始するのに最適な場所はhttp://adv-r.had.co.nz/Environments.html

+0

ありがとう、私はこれと上記のコメントが私が求めていたものに答えると思います。私はRがすべての新しいコピーを返すLispのようだと思います。 –

関連する問題