我正在尝试操作一些已解析的R代码并且遇到了与=运算符有关的问题。正如这个片段所示,我可以得到一个对象,说它的类型是“语言”,但是当它在为S4类的一个插槽赋值时R使用的“is”测试时返回false。
以下是一些示例代码:
parsed <- parse(text = "cylinders = c(4, 6, 8)")
print (typeof(parsed)) # Prints "expression"
langObj <- parsed[[1]]
print (typeof(langObj)) # Prints "language"
print (is(langObj, "language")) # Prints FALSE
setClass("Foo",
slots = list(
s1 = "language")
)
setMethod ("initialize",
"Foo",
function(.Object, obj){
.Object@s1 <- obj
return (.Object)
}
)
new (Class = "Foo", langObj)
最后一行产生错误:
Error in (function (cl, name, valueClass) :
assignment of an object of class “=” is not valid for @‘s1’ in an object of class “Foo”; is(value, "language") is not TRUE
请注意,如果使用&lt; - 运算符代替=,则代码按预期工作。
“typeof”和“is”有什么区别?为什么=运算符不会产生“语言”值,而&lt; - 呢?
答案 0 :(得分:2)
您需要了解typeof
返回相当低级别的特征,is( ... , "language")
测试更高级别的抽象。 typeof
没什么用处。询问对象的类通常更有用:
> class(parsed)
[1] "expression"
> class(parsed[[1]])
[1] "="
这第二个可能看起来有点奇怪,我认为它是call
或Ops
结果,但如果你看一下:
parsed[[1]]
#cylinders = c(4, 6, 8)
您会看到调用对象在内部表示,即解析树,如下所示:
`=`( cylinders, c(4, 6, 8) )
...注意到:
parsed[[1]][[1]]
`=` # note the backticks signifying a function, a language object
......而且这确实是一个调用对象:
is.call( parsed[[1]] )
#[1] TRUE
请参阅?parse
,其中解释该函数返回未评估的调用对象。我更像是一个S3家伙,所以试图解释你的S4东西出了什么问题是高于我的薪水等级。请注意,失败的S4工作的错误消息指的是' class '而不是'typeof'的不匹配