2012-03-15 11 views
13

ここでは、関数内からグローバル環境内の複数のオブジェクトに値を代入する方法が不思議です。これはlapplyassign<<-よりも安全かもしれませんが、私はそれを実際に使ったことはなく、それに精通していません)を使用しています。関数内から.GlobalEnvに複数のオブジェクトを割り当てよう

#fake data set 
df <- data.frame(
    x.2=rnorm(25), 
    y.2=rnorm(25), 
    g=rep(factor(LETTERS[1:5]), 5) 
) 

#split it into a list of data frames 
LIST <- split(df, df$g) 

#pre-allot 5 objects in R with class data.frame() 
V <- W <- X <- Y <- Z <- data.frame() 

#attempt to assign the data frames in the LIST to the objects just created 
lapply(seq_along(LIST), function(x) c(V, W, X, Y, Z)[x] <<- LIST[[x]]) 

私のコードの一部または全部を短縮して、この作業を改善してください(またはより速く/より速く動作するようにしてください)。

+3

この質問かそれに対する答えは大きな「子どもたち、家ではこれをしないでください!」と来なければなりません。免責事項。ご存知のように、関数内のグローバルな割り当ては、リチャード・バーンズ(http://www.burns-stat.com/pages/Tutor/R_inferno.pdf) – flodel

+0

@flodelを引用すると、災害のレシピ、つまり「火山の命」のレシピです。私はプログラマーではないので、あなたは割り当てを行うことの問題点を簡単に説明できますか? –

+0

私は引用したセクションを読んでいます。それは公共の消費のためのコードでは賢明だが個人的なコードではないようだ。あなたはこの影響を受けないで達成する方法を見ることができますか? –

答えて

22

あなたは正しく、assign()が仕事に適したツールです。そのenvir引数は、割り当てがどこで行われるかを正確に制御できます。制御は<-または<<-で利用できません。

したがって、たとえば、あなたがどうなる地球環境におけるNAMEという名前のオブジェクトにXの値を割り当てるには:お使いの場合には

assign("NAME", X, envir = .GlobalEnv) 

df <- data.frame(
    x.2=rnorm(25), 
    y.2=rnorm(25), 
    g=rep(factor(LETTERS[1:5]), 5) 
) 
LIST <- split(df, df$g) 
NAMES <- c("V", "W", "X", "Y", "Z") 

lapply(seq_along(LIST), 
     function(x) { 
      assign(NAMES[x], LIST[[x]], envir=.GlobalEnv) 
     } 
) 

ls() 
[1] "df" "LIST" "NAMES" "V"  "W"  "X"  "Y"  "Z"  
+0

ありがとうございます。私は '' - ''が悪い形だと知っていましたが、怠け者でした。私は 'assign'を使う習慣に入るでしょう。私は実際にあなたが一点で行ったことを正確に持っていましたが、私は既にそれらを割り当てていたので、オブジェクトの周りに引用符を入れてはいけないと思っていました。これはどのように簡単です。 –

+0

うん。 'assign()'を使うことは、試してみる前に乗り越えるためにはじめるようなものですが、いったんやり遂げると、なぜ最初に何か迷いがあったのだろうと思います。 –

+0

+1 - 金。私は環境内のすべてのオブジェクトを今すぐ地球環境に割り当てる必要があり、この解決策は私にそれを考える必要がありませんでした。 – ricardo

関連する問題