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

Ril*_*n42 1 scope r environment-variables scoping

几年后回到此帖子,以添加另一个警告:不要这样做

我正在尝试在全局环境中存储来自函数的变量,但是我发现SO post其他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
Run Code Online (Sandbox Code Playgroud)

代码(function_me.R)

doGlobalThing<-function(){
  #eval(v<-'hi',env=parent.frame(2)) #tried this, didnt work
   v<-'hi'
}
Run Code Online (Sandbox Code Playgroud)

Joh*_*man 5

您可以使用assign

assign("v","hi",envir = globalenv())
Run Code Online (Sandbox Code Playgroud)

这要求您将目标全局变量的名称作为字符串,但是即使使用数十种这样的向量,也可以很容易地做到这一点。

这个问题讨论了assign和之间的区别<<-。的主要区别是,assign允许您指定的环境-所以很容易把它在非全局,但持续的环境中使用来存储数据,让你可以如仿效R.静态变量虽然可以使用assign修改在全球环境中,您应该意识到这样做并不是一件好事。意外覆盖您不想覆盖的数据的风​​险太大。大量使用全局变量的代码几乎可以始终重构为更干净的代码,而不是。如果您需要从函数到调用环境获取大量异构数据,则最干净的解决方案是将所需数据返回到列表中。

接受的答案结束的讨论<<-,并assign具有良好的报价:

邪恶和错误的用法是在全局环境中修改变量。

  • 我对此表示反对,因为您没有包括这样的网站效果不好的强烈警告。如果在全局环境中碰巧有一个`v`变量,它将被覆盖,这会导致错误,很难找到。 (2认同)
  • @罗兰好点。我已对其进行了编辑,以包括适当的警告。 (2认同)