2

在我的 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).

4

1 回答 1

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 )}
    
于 2013-07-08T09:37:27.780 回答