如果我只知道对象的名称作为字符串,我怎么能覆盖R中的对象?

时间:2013-07-08 09:16:11

标签: r object reference pass-by-name

在我的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 <- as.matrix(myvector)

1 个答案:

答案 0 :(得分:3)

您尝试按名称分配函数中的全局变量。为什么?应该避免操纵全局变量并且如评论中所述应该存在更好的方式来处理您的问题并避免全局变量的副作用。
您应该使用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 )}