2016-05-26 1 views
-2

forループ内で呼び出すことによって、関数myfunction内にデータフレームを構築しようとしています。r:forループで呼び出される関数のデータフレームへの列の追加

この

df = data.frame("Indices" = c("a", "b")) 

myfunction = function(i){ 
    df = cbind(df, as.data.frame(rbind(i,i^2))) 
} 

for(i in 1:10){ 
    myfunction(i) 
} 

私の目的は、forループの各反復を通じてdfに1つの以上の列を追加することであるように見えます。 しかし、残念ながらdfは空のままです(つまり、それ以上の列は追加されません)。

V1 V1 V1 V1 V1 V1 V1 V1 V1 V1 
a 1 2 3 4 5 6 7 8 9 10 
b 1 4 9 16 25 36 49 64 81 100 

は私が間違って何をやっている:

だから、最後には次のようになりますか?

+2

ループに 'df < - 'を追加してください。あなたは何かを忘れてしまった。 – lmo

+0

この特定の例では、ループ構成体は必要ありません。 'df < - cbind(df、as.data.frame(rbind(1:n、(1:n)^ 2)))' –

+0

'mylist = lapply(setNames(1:10、1:10)、function( i)c(i、i^2));最後のステップとして、df [names(mylist)] = mylist'または 'df = cbind(df、mylist)'を指定します。 – Frank

答えて

0

それとも機能を使用したい場合は、ここで何ができるかです:

df = data.frame("Indices" = c("a", "b")) 

myfunction = function(i, df){ 
    return(cbind(df, as.data.frame(rbind(i,i^2)))) 
} 

for(i in 1:10){ 
    df=myfunction(i, df) 
} 

> df 
    Indices V1 V1 V1 V1 V1 V1 V1 V1 V1 V1 
i  a 1 2 3 4 5 6 7 8 9 10 
     b 1 4 9 16 25 36 49 64 81 100 

我々は関数を呼び出すと、我々は戻っ機能からの変化を持たせたい場合は、我々はの世話をする必要がありますバリューケースによる参照または呼び出しによる呼び出し。価値によって関数を呼び出すため、関数が機能しない理由があります。したがって、関数内の変更は、現在のスコープに依存しません。

0

スコープの問題が発生しています。

関数内でdfを変更しても、関数外では何も変更されません。これを解決する方法はたくさんありますが、おそらく関数を取り除くのが最も簡単です。

for(i in 1:10){ 
    df = cbind(df, as.data.frame(rbind(i,i^2))) 
} 
+3

ループ内でオブジェクトを拡大することは良い方法ではありません。私は答えとして投稿しません。 –

関連する問題