如何避免<< - 使用assign

Tyl*_*ker 5 r

我经常使用两段代码,我在其中使用<<-从函数中分配给Global环境.我知道我应该使用assign它,因为它提供了更好的控制,更可预测.我试图包围使用assign但不能将<<-代码转移到使用assign的代码:

一个伪造的数据集和两个代码的代码 <<-

#CREATE A FAKE DATA SET
df <- data.frame(
    x.2=rnorm(25),
    y.2=rnorm(25),
    g=rep(factor(LETTERS[1:5]), 5)
)
#Use split to make a list of data frames
LIST <- split(df, df$g) #split it into a list of data frames
NAMES <- names(LIST) #save the names of this for later use 
LIST <- lapply(seq_along(LIST), function(x) as.data.frame(LIST[[x]])[, 1:2])

#THE TWO PIECES OF CODE THAT USE <<-
#Use Global Assignment to Change All Variable Names of Data Frames in a List
lapply(seq_along(LIST), function(x) names(LIST[[x]]) <<-
    unlist(strsplit(names(LIST[[x]])[1:length(names(LIST[[x]]))],
    ".", fixed=T))[c(T, F)]
)
LIST

#Rename All the Data Frames in the List Using Global Assignment
lapply(seq_along(LIST), function(x) names(LIST)[[x]] <<- NAMES[x])
LIST
Run Code Online (Sandbox Code Playgroud)

我尝试使用assign:

lapply(seq_along(LIST), function(x) {
    assign(names(LIST[[x]]), 
    unlist(strsplit(names(LIST[[x]])[1:length(names(LIST[[x]]))],
    ".", fixed=T))[c(T, F)],  envir=.GlobalEnv)
    }
)
LIST

lapply(seq_along(LIST), function(x) assign(names(LIST)[[x]], 
    NAMES[x], envir=.GlobalEnv))
LIST
Run Code Online (Sandbox Code Playgroud)

请帮我正确地做到这一点并解决我的方法有什么问题.先感谢您.

GSe*_*See 2

我认为这是同一件事

LIST <- lapply(seq_along(LIST), function(x) {
  names(LIST[[x]]) <- 
    unlist(strsplit(names(LIST[[x]])[1:length(names(LIST[[x]]))],
                    ".", fixed=T))[c(T, F)]
  LIST[[x]]
})
LIST

names(LIST) <- NAMES
LIST
Run Code Online (Sandbox Code Playgroud)

或者,使用分配

assign("LIST", lapply(seq_along(LIST), function(x) {
  names(LIST[[x]]) <- 
    unlist(strsplit(names(LIST[[x]])[1:length(names(LIST[[x]]))],
                    ".", fixed=T))[c(T, F)]
  LIST[[x]]
}), pos=.GlobalEnv)
Run Code Online (Sandbox Code Playgroud)