【发布时间】:2012-04-01 08:56:43
【问题描述】:
一天前在这里的一篇文章让我想知道如何从一个函数中为全局环境中的多个对象分配值。这是我使用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]])
请随意缩短我的代码的任何/所有部分以使这项工作(或工作得更好/更快)。
【问题讨论】:
-
这个问题或任何答案都应该伴随着一句“孩子们,不要在家里做这个!”免责声明。您可能知道,函数中的全局分配是灾难的根源,或者引用 Richard Burns (burns-stat.com/pages/Tutor/R_inferno.pdf) 的话来说是“火山旁的生活”
-
@flodel 我不是程序员,所以你能简单解释一下分配的问题吗?
-
我将引用维基百科关于全局变量的内容:由于它们的非局部性,它们通常被认为是不好的做法:全局变量可以从任何地方修改(除非它们驻留在受保护的内存中或以其他方式呈现为只读),并且程序的任何部分都可能依赖于它。 [1]因此,全局变量具有创建相互依赖关系的无限潜力,而添加相互依赖关系会增加复杂性。
-
好的...通过更好地了解您的特定情况,您似乎并没有偏离您的全球环境太远,因此“相互依赖”的风险在这里非常小,乔希的回答很好。尽管如此,我希望我的警告可以帮助其他可能试图“在一个函数内将多个对象分配给 .GlobalEnv”(您的问题标题)但在更复杂的上下文中的人。
-
我得说,当涉及到复杂/脏数据时,为一组 a不编程的人,这是将他们带入计划的好方法,而无需对他们进行编程培训。
标签: r global environment assign assignment-operator