在字符串上使用eval()来访问R

时间:2015-12-11 16:42:50

标签: r eval

我正在尝试使用R中名称的字符串值来引用空间对象的数据属性列。我只使用eval()引用该对象没有问题,但我无法引用使用相同的过程在对象中的属性。

所以:

summary(eval(as.symbol(paste0("layerName", "_p", "5"))))

指对象layerName_p5没有问题。然而

summary(eval(as.symbol(paste0("layerName", "_p", "5", "@data$colName"))))

不起作用,抛出以下错误:

  

摘要错误(eval(as.symbol(paste0(“layerName”,“_ p”,“5”,   “@ data $ colName”)))):在评估参数'object'时出错   选择函数'summary'的方法:eval中的错误(expr,envir,   enclos):对象'layerName_p5 @ data $ colName'未找到

我在这里要注意,@ dat用于指向空间对象layerName_p5中的data属性,$ colName是该数据属性中的列。我知道这存在,因为调用

summary(eval(as.symbol(paste0("opNeon", "_p", "5")))@data$patRoute)

确实有效。但我理想的是也希望能够使用字符串来引用调用的第二部分。

所以最终我的问题是为什么我不能使用eval()(或者get())的名称字符串来引用对象中的属性?

我尝试过的东西包括一个嵌套的eval()语句(我可能已经或可能没有正确使用...)并尝试使用方括号访问属性。两次尝试都有以下相关错误消息:

eval(eval(as.symbol(paste0("layerName", "_p", "5"))),"@data$colName")
  

eval中的错误(eval(as.symbol(paste0(“layerName”,“_ p”,“5”))),   “@ data $ colname”):'character'类型的'envir'参数无效

eval(as.symbol(paste0("layerName", "_p", "5")))[eval(as.symbol("@data$colName"))]
  

eval(expr,envir,enclos)中的错误:找不到对象'@ data $ colName'

我想知道是否有人遇到过这个问题,如果有的话,是否有任何解决方案,或者我是否只是做错了?非常感谢任何帮助!

1 个答案:

答案 0 :(得分:2)

使用工作示例中的名称

eval(call("$",
          eval(call("@",
                    as.symbol(paste0("opNeon", "_p", "5")),
                    as.symbol("data"))),
          as.symbol("patRoute")))

eval(call("@",
          as.symbol(paste0("opNeon", "_p", "5")),
          as.symbol("data")))[["patRoute"]]

会起作用。

部分匹配

如果要匹配data.frame列的部分名称,则第一个选项可以正常工作。对于第二个选项,您需要将exact = FALSE添加为[[的选项。例如,

eval(call("@",
          as.symbol(paste0("opNeon", "_p", "5")),
          as.symbol("data")))[["patR", exact=FALSE]]

会使用"patR"作为"patRoute"的缩写形式返回相同的结果,假设opNeon_p5@data中没有其他列名以字符串"patR"开头。

我想在您的用例(或一般的非交互式使用)中几乎不需要部分匹配。在R提示中键入?Extract以获取有关部分匹配的更多信息。

为什么初始尝试失败

现在让我们为其余的示例切换到较短的标识符abceval(as.symbol("a@b"))eval(as.symbol("a$c"))eval(as.symbol("a@b$c"))不起作用的原因是符号名称引用变量,但`@``$`作为运算符不属于变量名。

小字

另一个可行的选项是eval(parse(text="a@b$c")),其中text可以通过任何方式构建。只要您确定text的内容,这是安全的,但不建议评估任意表达式。