多年后回到这篇文章,再添一句警告:不要这样做
我正在尝试从全局环境中的函数存储变量,但我发现SO post或different SO post的解决方案都不适用于我。这是一个非常简单的例子来说明我的问题。我不能只使用<<-
使v
全局变量,因为我的实际函数会创建几十个变量。
代码(main_file.R)
source("function_me.R")
#environment(doGlobalThing) <-parent.frame(2) #didnt work
doGlobalThing()
v #cant get to this var from the global environment
代码(function_me.R)
doGlobalThing<-function(){
#eval(v<-'hi',env=parent.frame(2)) #tried this, didnt work
v<-'hi'
}
答案 0 :(得分:5)
您可以使用assign
:
assign("v","hi",envir = globalenv())
这要求您将目标全局变量的名称作为字符串,但即使使用了许多此类内容的向量,也可以轻松完成此操作。
This question讨论了assign
和<<-
之间的差异。主要区别在于assign
允许您指定环境 - 因此很容易使用它来将数据存储在非全局但持久的环境中,以便您可以例如在R.中模拟静态变量虽然可以使用assign
来修改全局环境,但是你应该意识到这样做很少是一件好事。存在太多意外覆盖您不想覆盖的数据的危险。大量使用全局变量的代码几乎总是可以重构为更清晰的代码,而这些代码并非如此。如果您需要从函数到调用环境获取大量异构数据,那么最干净的解决方案是在列表中返回所需的数据。
accepted answer以良好的引语结束对<<-
和assign
的讨论:
邪恶和错误的用法是修改全局变量 环境。