【问题标题】:R: how to replicate the <<- assignment with assign()?R:如何使用 assign() 复制 <<- 分配?
【发布时间】:2014-09-11 10:26:34
【问题描述】:

我需要在函数中分配一个变量,其名称是函数的参数,并且我需要稍后在函数外部访问它。我认为&lt;&lt;- 在另一种情况下会这样做,但由于变量的名称是动态的,我想我需要assign()

我现在拥有的东西

assignVar = function(varname) {
     assign(varname,"blabla")
}
assignVar("foo")
foo

返回通常的Error: object 'foo' not found

assign 函数或任何其他秘密武器是否有一些选项可供我使用?我已经查看了文档,但我仍然对环境感到非常困惑......(R初学者)。

【问题讨论】:

  • 不要这样做。只需将所需的所有变量作为函数的结果返回列表中,您就可以省去很多麻烦。
  • 试试assign(varname,"blabla", .GlobalEnv),虽然不推荐
  • @Andrie,我认为你是对的,但我不知道该怎么做。我需要一个函数来检查 RDS 文件是否存在并将其加载到变量中(作为参数传递)。如果文件不存在,或者需要重新创建,该函数会执行一个 R 脚本(其路径作为参数传递)来生成文件,并将其保存在内存中。在那种情况下,我真的不能拥有df &lt;- checkLoad(dataset.path,scriptToGenerate.path),因为如果函数运行生成数据的脚本(并在该脚本中将其分配给df),那么上面的命令将覆盖df
  • 你在问一个新问题——我建议你确实问一个新问题。我想我们已经回答了你原来的问题。但是为什么不把你的结果分配给df_new 呢?
  • 我建议您提出一个新问题,在其中概述您正在做的事情并寻求更好的方法。我不清楚你目前在做什么,但我可以向你保证,我从来没有使用过assign()

标签: r global-variables variable-assignment


【解决方案1】:

在使用之前了解&lt;&lt;- 的行为非常重要。一旦你理解了这种行为,你也会注意到你不能使用assign 来实现它的行为(至少不是很容易)。这是一个简单的例子:

a <- 1
f1 <- function(){
    a <<- 2
    NULL
}
f1()
a
# [1] 2

a <- 1
f2 <- function(){
    a <- 2
    f3 <- function(){
        a <<- 3
    }
    f3()
    NULL
}
f2()
a
# [1] 1

&lt;&lt;- 如果可能的话,通过分配到父环境来工作。如果那里没有现有的a 对象(在此示例中),它会上升另一个级别并重复此操作,直到它到达全局环境,如果没有其他较低的环境工作,它将最终分配。所以在上面的例子中,f1() 会导致全局环境发生变化,但f2() 不会。如果你注释掉f2a&lt;-2 行,你会得到全局环境的改变。

要使用assign 实现相同的行为,您需要编写一个更复杂的函数,循环遍历父环境,直到它到达全局环境。无论如何,通常不鼓励函数产生副作用(因为通常会给代码带来不必要的复杂性,尤其是当这些副作用发生在全局环境中时)。

【讨论】:

    【解决方案2】:

    我强烈建议你不要这样做:

    assignVar = function(varname, envir = globalenv()) {
      assign(varname, "blabla", envir=envir)
      invisible(NULL)
    }
    
    assignVar("foo", envir=globalenv())
    foo
    [1] "blabla"
    

    【讨论】:

      猜你喜欢
      • 2015-04-08
      • 2015-05-05
      • 1970-01-01
      • 2014-09-15
      • 2013-04-23
      • 1970-01-01
      • 2020-02-01
      • 2020-07-23
      • 2015-11-08
      相关资源
      最近更新 更多