从函数中为.GlobalEnv分配多个对象

Tyl*_*ker 24 environment global r assignment-operator assign

这一天发布的帖子让我想知道如何在函数中为全局环境中的多个对象赋值.这是我的尝试使用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]])
Run Code Online (Sandbox Code Playgroud)

请随意缩短我的代码的任何/所有部分以使其工作(或更好/更快地工作).

Jos*_*ien 32

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"
Run Code Online (Sandbox Code Playgroud)

原始答案,演示使用assign()

你是对的,这assign()是工作的正确工具.它的envir参数让您能分配进行精确控制-控制,是不是可以既<-<<-.

因此,例如,要将值分配给在全局环境中X命名的对象NAME,您将执行以下操作:

assign("NAME", X, envir = .GlobalEnv)
Run Code Online (Sandbox Code Playgroud)

在你的情况下:

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"    
Run Code Online (Sandbox Code Playgroud)