我正在尝试使用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'
我想知道是否有人遇到过这个问题,如果有的话,是否有任何解决方案,或者我是否只是做错了?非常感谢任何帮助!
答案 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
以获取有关部分匹配的更多信息。
现在让我们为其余的示例切换到较短的标识符a
,b
和c
。 eval(as.symbol("a@b"))
,eval(as.symbol("a$c"))
或eval(as.symbol("a@b$c"))
不起作用的原因是符号名称引用变量,但`@`
和`$`
作为运算符不属于变量名。
小字
另一个可行的选项是eval(parse(text="a@b$c"))
,其中text
可以通过任何方式构建。只要您确定text
的内容,这是安全的,但不建议评估任意表达式。