将函数中的变量存储在全局环境中

store variables from a function in the global environment

post 年后回到这里来添加另一个警告:不要这样做

我试图在全局环境中存储来自函数的变量,但我发现 SO post or 的 none 解决方案对我有用。这是一个非常简单的例子来说明我的问题。我不能只使用 <<- 使 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'
}

你可以使用 assign:

assign("v","hi",envir = globalenv())

这需要您将目标全局变量的名称作为字符串,但即使使用包含许多此类内容的向量也可以轻松做到这一点。

This question 讨论了 assign<<- 之间的区别。主要区别在于 assign 允许您指定环境——因此很容易使用它在非全局但持久的环境中存储数据,这样您就可以,例如在 R 中模拟静态变量。虽然可以使用 assign 来修改全局环境,但您应该意识到这样做很少是一件好事。意外覆盖您不想覆盖的数据的危险太大了。大量使用全局变量的代码几乎总是可以重构为更简洁的代码,而不会。如果您需要从函数获取大量异构数据到调用环境,最干净的解决方案是 return 列表中的所需数据。

accepted answer 以一句好话结束了对 <<-assign 的讨论:

The Evil and Wrong use is to modify variables in the global environment.