R 从一个函数中将多个对象分配给.GlobalEnv

R 从一个函数中将多个对象分配给.GlobalEnv,r,global,environment,assign,assignment-operator,R,Global,Environment,Assign,Assignment Operator,前一天在这里的一篇帖子让我想知道如何从一个函数中为全局环境中的多个对象赋值。这是我尝试使用lappy(assign可能比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 <

前一天在这里的一篇帖子让我想知道如何从一个函数中为全局环境中的多个对象赋值。这是我尝试使用
lappy
assign
可能比
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"
就你而言:

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"    

df如果有对象名称和文件路径列表,也可以使用
mapply

object_names <- c("df_1", "df_2", "df_3")
file_paths   <- list.files({path}, pattern = ".csv", full.names = T)
    
mapply(function(df_name, file) 
           assign(df_name, read.csv(file), envir=.GlobalEnv),
       object_names,
       file_paths)

object\u名称谢谢。我知道
是的。使用
assign()
是一个在你尝试之前看起来很难克服的问题,但是一旦你尝试了,你就会想,为什么你一开始会有任何犹豫。+1-gold。我刚才必须将一个环境中的所有对象分配到全局环境中,这个解决方案让我不用再思考了。我应该什么时候使用envir=.GlobalEnv and when envir=parent.frame()?这个问题或任何答案都应该附带一个大的“孩子们,不要在家里这样做!”免责声明。正如您可能知道的,函数中的全局赋值会导致灾难,或者引用Richard Burns的话“火山口边的生活”()@flodel我不是程序员,所以你能简单解释一下赋值的问题是什么吗?我将引用维基百科关于全局变量的内容:它们通常被认为是不好的做法,正是因为它们的非局部性:全局变量可以从任何地方修改(除非它们位于受保护的内存中或以其他方式呈现为只读),并且程序的任何部分都可能依赖于它。[1]因此,全局变量具有无限的潜力来创建相互依赖,添加相互依赖会增加复杂性。好吧……通过更好地了解您的特定情况,您似乎不会偏离您的全局环境太远,因此“相互依赖”的风险在这里非常小,Josh的答案非常好。不过,我希望我的警告可以帮助其他人,他们可能会试图“从一个函数中为.GlobalEnv分配多个对象”(您的问题标题),但在更复杂的上下文中。我得说,当涉及复杂/肮脏的数据时,开发具有重UI的函数(select.list(),locator(),identify(),getGraphicsEvent()),对于不编程的a组人员来说,这是一种很好的方法,可以将他们引入程序,而无需对他们进行编程培训。
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"    
object_names <- c("df_1", "df_2", "df_3")
file_paths   <- list.files({path}, pattern = ".csv", full.names = T)
    
mapply(function(df_name, file) 
           assign(df_name, read.csv(file), envir=.GlobalEnv),
       object_names,
       file_paths)