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)
您可以使用assign:
assign("v","hi",envir = globalenv())
Run Code Online (Sandbox Code Playgroud)
这要求您将目标全局变量的名称作为字符串,但是即使使用数十种这样的向量,也可以很容易地做到这一点。
这个问题讨论了assign和之间的区别<<-。的主要区别是,assign允许您指定的环境-所以很容易把它在非全局,但持续的环境中使用来存储数据,让你可以如仿效R.静态变量虽然可以使用assign修改在全球环境中,您应该意识到这样做并不是一件好事。意外覆盖您不想覆盖的数据的风险太大。大量使用全局变量的代码几乎可以始终重构为更干净的代码,而不是。如果您需要从函数到调用环境获取大量异构数据,则最干净的解决方案是将所需数据返回到列表中。
该接受的答案结束的讨论<<-,并assign具有良好的报价:
邪恶和错误的用法是在全局环境中修改变量。