将函数中的变量存储在全局环境中
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.
post 年后回到这里来添加另一个警告:不要这样做
我试图在全局环境中存储来自函数的变量,但我发现 SO post or <<-
使 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.