2012-03-22 16 views
0

ループは機能しますが、関数内で使用しようとすると機能しません。 以下ループの前と後のデータフレームを示す余分な列を追加するためのループは機能内では機能しませんが、

DF

MSU 
1 12 
2 11 
3 6 
4 5 
5 6 
6 6 

ループ

for (i in 1:nrow(DF)) 
{ 
    if(i<4) { DF[ i, 2 ] <- 0} else 
    { 
     DF[ i, 2 ] <- ((DF[1,1] + DF[i-1,1] + DF[i-2,1] + DF[i-3,1])/4) 
    } 
} 

ループ後DF、余分な列は、最後の4つの値の平均値と追加されています値の数が4未満の場合を除きます。ループ付き関数の後にループ

myfct <- function(DF){ 
for (i in 1:nrow(DF)) 
{ 
    if(i<4) { DF[ i, 3 ] <- 0} else 
    { 
     DF[ i, 3 ] <- ((DF[i,1] + DF[i-1,1] + DF[i-2,1] + DF[i-3,1])/4) 
    } 
} 
} 

DFと

MSU V2 
1 12 0.00 
2 11 0.00 
3 6 0.00 
4 5 10.25 
5 6 8.50 
6 6 7.25 

機能は、BA 2列と同じ値を持つ追加の列が、そこに付加されていないはずです。私は、ループが実行されていることを示すためにprintを使いました。値は3列目に置くことを期待しています。

MSU V2 
1 12 0.00 
2 11 0.00 
3 6 0.00 
4 5 10.25 
5 6 8.50 
6 6 7.25 

答えて

3

Rは引数ではなく、参照渡しで値を渡します。つまり、オブジェクトを関数に渡すと、Rはオブジェクトのローカルコピーを作成します。関数内でオブジェクトに加えた変更は、元のコピーではなくローカルコピーにのみ影響します。

DFを変更するには、関数に新しく変更されたデータフレームを返し、古い値DFを上書きする必要があります。あなたが関数の最後に行return(DF)を追加し、

> DF 
    MSU V2 V3 
1 12 0.00 0.00 
2 11 0.00 0.00 
3 6 0.00 0.00 
4 5 10.25 8.50 
5 6 8.50 7.00 
6 6 7.25 5.75 

V2V3であることを理由になり

DF <- myfct(DF) 

でそれを呼び出すこれを行うには

あなたの元のループコードにバグがあります:DF[1,1]と書いてありますが、おそらくDF[i,1]と書いていたはずです。

関連する問題