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

Bar*_*ara 7 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)
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"有什么区别?为什么=运算符不会产生"语言"值,而< - 呢?

42-*_*42- 2

您需要了解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”的不匹配