2016-08-11 15 views
6

解析されたRコードを操作しようとしていて、=演算子で問題が発生しました。このスニペットが示すように、その型が "言語"であるというオブジェクトを取得できますが、RがS4クラスのスロットに値を代入するときに使用する "is"テストではfalseを返します。 - 演算子=の代わりに使用され、予想通り、コードが動作する<があればということ構文解析= Rの演算子は言語オブジェクトを生成しません

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 

注:この最後の行はエラーに生成

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){ 
    [email protected] <- obj 
    return (.Object) 
    } 
) 

new (Class = "Foo", langObj) 

:ここ

は、いくつかのサンプルコードです。

"typeof"と "is"の違いは何ですか?なぜ=演算子は< - は "言語"の値を生成しないのですか?

+2

なぜ '='かという簡単な答えは有効な言語オブジェクトではない''( ''、' ')」と書かれていますが、これは明示的に' '(' '、' ' 、 、 "の" 、 "IF" ' "{"、 を "一方"、 "名前" を "繰り返し"。 – nrussell

+0

' is.language(langObj)を使用して 'TRUE印刷されます。 場合目的は、あなたが評価できるようにしたいという表現を持つことです'langObj < - parsed'と' setClass( "Foo"、slots = list(s1 = "expression")) 'を使って割り当ててください。 –

答えて

2

typeofはかなり低いレベルのキャラクタライゼーションを返し、is(... , "language")はいくらか高いレベルの抽象化をテストすることを理解する必要があります。 typeofの用途はあまりありません。この第二の1のビット奇妙に思えるかもしれない、と私はそれがeitehr callかとOps結果であると考えているだろう

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

ていますが、見れば:それは、オブジェクトのクラスを求めるため、一般的に、より便利ですそれに注意...

`=`(cylinders, c(4, 6, 8)) 

::あなたが呼び出し対象として、構文解析木すなわち、内部的に表現していることがわかり

parsed[[1]] 
#cylinders = c(4, 6, 8) 
parsed[[1]][[1]] 
`=` # note the backticks signifying a function, a language object 

...と、これは本当にコール・オブジェクトであること:

is.call(parsed[[1]]) 
#[1] TRUE 

機能が未評価のコール・オブジェクトを返すことを説明され?parseを参照してください。私はあなたのS4のもので間違っていることを説明しようとする私の給与グレードの上にあるので、S3の男の詳細です。あなたの失敗したS4の取り組みからのエラーメッセージは、 'typeof'ではなく 'class'の不一致を参照していることに注意してください。

+0

大きな説明。私の解決策は、上のEdward Carneyの示唆したように、解析されたオブジェクトの代わりに式オブジェクトを格納することです。 – Barbara

関連する問題