web-dev-qa-db-ja.com

関数内から.GlobalEnvに複数のオブジェクトを割り当てます

1日前のここへの投稿で、関数内からグローバル環境内の複数のオブジェクトに値を割り当てる方法について疑問に思っています。これはlapplyを使用した私の試みです(assign<<-より安全かもしれませんが、実際に使用したことがなく、慣れていません)。

#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]])

これを機能させる(またはより良く/より速く)ために、コードの一部/すべての部分を自由に短くしてください。

24
Tyler Rinker

2018-10-10の更新:

この特定のタスクを実行する最も簡潔な方法は、次のようにlist2env()を使用することです。

_## Create an example list of five data.frames
df <- data.frame(x = rnorm(25),
                 g = rep(factor(LETTERS[1:5]), 5))
LIST <- split(df, df$g)

## Assign them to the global environment
list2env(LIST, envir = .GlobalEnv)

## Check that it worked
ls()
## [1] "A"    "B"    "C"    "D"    "df"   "E"    "LIST"
_

元の回答、assign()の使用を示す

assign()がその仕事に適したツールであることは間違いありません。そのenvir引数により、割り当てが行われる場所を正確に制御できます。つまり、_<-_または_<<-_では使用できない制御です。

したがって、たとえば、グローバル環境でXという名前のオブジェクトにNAMEの値を割り当てるには、次のようにします。

_assign("NAME", X, envir = .GlobalEnv)
_

あなたの場合:

_df <- data.frame(x = 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"    
_
32
Josh O'Brien