【问题标题】:How can I overwrite an object in R if I only know the name of the object as a character string?如果我只知道对象的名称作为字符串,如何覆盖 R 中的对象?
【发布时间】:2013-07-08 09:16:10
【问题描述】:

在我的 R 函数中,我正在处理一个字符串,该字符串包含位于工作区某处的对象的名称。我想覆盖对象(例如,将对象转换为矩阵)。

但是,我只知道对象的名称是字符串,我没有对象引用。我知道我可以使用get(x) 函数(其中x 是引用对象的字符串)或eval(as.name(x)) 之类的东西将字符串转换为对象引用。但是,这仅适用于访问对象,不适用于覆盖对象。

我怎样才能做到这一点?这是一些代码:

myvector <- 1:5              # my object
x <- "myvector"              # text representation of the object
get(x) <- as.matrix(get(x))  # my first attempt
eval(as.name(x)) <- as.matrix(eval(as.name(x)))  # second attempt

请注意,第一行不是我要在工作区中覆盖此对象的函数的一部分,因此我不能只写myvector &lt;- as.matrix(myvector)

【问题讨论】:

  • 你在找?assign吗?:assign(x= "myvector" ,newvalue)
  • 酷,这比我想象的要容易得多!非常感谢!所以解决方案是:assign(x, as.matrix(get(x)))
  • 我怀疑你正在做的任何事情都应该以更好的方式完成。

标签: r object reference pass-by-name


【解决方案1】:

您尝试在函数中按名称分配全局变量。为什么?应该避免操纵全局变量,正如评论中所说,应该存在更好的方式来处理您的问题并避免全局变量的副作用。
您应该使用assign 按名称更改值。默认情况下,它会在当前环境(本地)中更改值,因此您还应该设置变量在哪个环境中定义。像这样的东西:

 assign( x , as.matrix(get(x)),envir=.GlobalEnv)

或者,告诉assign 搜索直到遇到变量:

 assign( x , as.matrix(get(x)),inherits=TRUE)

编辑更好的解决方案

  1. 返回新值,稍后在全局环境中赋值

    assign( x , function(x){....})
    
  2. 如果变量是一种全局设置,您可以定义一个环境来定义 myvector。

    myoptions <- new.env()
    myoptions$myvalue <- 1:5
    function(x){ assign(x,newvalue,myoptions )}
    

【讨论】:

  • 感谢您的提示。我对环境不是很熟悉。如果将对象从全局环境复制到函数并仅在函数内部覆盖,那就没问题了。或者,如果在函数中本地创建了一个同名的新对象(而不是覆盖它)。
  • @SpammerSlammer 更好的是返回新值并稍后在全局环境中分配它。
  • @SpammerSlammer 你可以看到我的编辑。我建议了几个解决方案。
  • 我不太了解您的编辑,但您的原始解决方案似乎对我有用。我需要一个本地环境中的新对象(即仅在函数内部),它与全局环境中的对象具有相同的名称,但我可以为其分配一个新值。局部对象仅用于函数内的估计,但至关重要的是它与全局对象具有相同的名称。所以我认为这可以在我的函数中使用assign(x, as.matrix(get(x))) 来实现,而无需任何额外的选项。 (至少在我尝试时它似乎有效。)
  • 您说:“与全局对象同名至关重要”?为什么?这里的设计很糟糕!
猜你喜欢
  • 2015-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-04
  • 2010-10-15
  • 2021-01-25
  • 1970-01-01
  • 2013-12-03
相关资源
最近更新 更多