R中的Parsing =运算符不会产生语言对象

时间:2016-08-11 21:58:12

标签: r

我正在尝试操作一些已解析的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; - 呢?

1 个答案:

答案 0 :(得分:2)

您需要了解typeof返回相当低级别的特征,is( ... , "language")测试更高级别的抽象。 typeof没什么用处。询问对象的类通常更有用:

> class(parsed)
[1] "expression"
> class(parsed[[1]])
[1] "="

这第二个可能看起来有点奇怪,我认为它是callOps结果,但如果你看一下:

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'的不匹配