我试图操纵一些解析的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)
Run Code Online (Sandbox Code Playgroud)
最后一行产生错误:
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
Run Code Online (Sandbox Code Playgroud)
请注意,如果使用< - 运算符代替=,则代码按预期工作.
"typeof"和"is"有什么区别?为什么=运算符不会产生"语言"值,而< - 呢?
您需要了解typeof返回相当低级别的表征并is( ... , "language")测试较高级别的抽象。没有太大用处typeof。通常,询问对象的类更有用:
> class(parsed)
[1] "expression"
> class(parsed[[1]])
[1] "="
Run Code Online (Sandbox Code Playgroud)
第二个可能看起来有点奇怪,我本以为它是一个call或与Ops结果,但如果你看一下:
parsed[[1]]
#cylinders = c(4, 6, 8)
Run Code Online (Sandbox Code Playgroud)
您会看到调用对象在内部表示,即解析树,如下所示:
`=`( cylinders, c(4, 6, 8) )
Run Code Online (Sandbox Code Playgroud)
...注意到:
parsed[[1]][[1]]
`=` # note the backticks signifying a function, a language object
Run Code Online (Sandbox Code Playgroud)
...这实际上是一个调用对象:
is.call( parsed[[1]] )
#[1] TRUE
Run Code Online (Sandbox Code Playgroud)
查看?parse哪里解释了该函数返回未计算的调用对象。我更像是一个 S3 人,所以试图解释你的 S4 东西出了什么问题超出了我的工资等级。请注意,您失败的 S4 工作的错误消息涉及“ class ”而不是“typeof”的不匹配