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

时间:2016-06-01 02:24:49

标签: r scope environment-variables scoping

多年后回到这篇文章,再添一句警告:不要这样做

我正在尝试从全局环境中的函数存储变量,但我发现SO postdifferent 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'
}

1 个答案:

答案 0 :(得分:5)

您可以使用assign

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

这要求您将目标全局变量的名称作为字符串,但即使使用了许多此类内容的向量,也可以轻松完成此操作。

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

accepted answer以良好的引语结束对<<-assign的讨论:

  

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