quote, substitute, language, symbol, name, expression, formula, quo, enquo あたりを見ていく予定。長くなりそう。
これの続き。 niszet.hatenablog.com
実際に見てみる。
たとえば、こういう感じである。
View(a~b~c~d)
a~b~c~d
はformula
であるが、階層構造となっていて~
, a~b~c
, d
に分解されている。a~b~c
はさらに分解されて、最終的には~
, a
, b
に分解される。
また、formula
はattributes
を持っていて、class
としてformula
、そして.Environment属性として、環境を持つ。この環境はR_GlobalEnv
であることがわかる(この環境はおそらく常に作成された環境となるはず。次回以降見てみる。)
attr((a~b~c~d) ,".Environment") #> <environment: R_GlobalEnv>
実際に、こんな感じに書けば、
(a~b~c~d)[[2]][[2]][[2]] #> a
a
を取り出すことも可能。a
. b
. c
, d
と~
はそれぞれsymbol
で、
is.symbol((a~b~c~d)[[2]][[2]][[2]]) #> [1] TRUE
となる。symbol
はname
ともいわれるが、それは
mode((a~b~c~d)[[2]][[2]][[2]]) #> [1] "name"
で、
is.name((a~b~c~d)[[2]][[2]][[2]]) #> [1] TRUE
である。
これがsymbol
であることを値として取り出すなら、
typeof((a~b~c~d)[[2]][[2]][[2]]) #> [1] "symbol"
である。str()
でも見れる。
str((a~b~c~d)[[2]][[2]][[2]]) #> symbol a
なお、a
の取り出し時に[[
ではなく[
で抜き出すと
(a~b~c~d)[[2]][[2]][2] #> a()
のようになって、もはやsymbolではない
is.symbol((a~b~c~d)[[2]][[2]][2]) #> [1] FALSE
これはcallableなオブジェクトである。
is.call((a~b~c~d)[[2]][[2]][2]) #> [1] TRUE mode((a~b~c~d)[[2]][[2]][2]) #> [1] "call"
具体的にはlanguage
である。
typeof((a~b~c~d)[[2]][[2]][2]) #> [1] "language" is.language((a~b~c~d)[[2]][[2]][2]) #> [1] TRUE
ちなみに、language
はformula
ではない。
plyr::is.formula((a~b~c~d)[[2]][[2]][2]) #> [1] FALSE
ただし、formula
はlanguage
である1。
plyr::is.formula((a~b~c~d)) #> [1] TRUE is.language((a~b~c~d)) #> [1] TRUE
また、[[
でアクセスできるからと言って、list
でもない
is.list((a~b~c~d)) #> [1] FALSE is.list((a~b~c~d)[[2]][[2]][2]) #> [1] FALSE
基本的なことは大体見れたはずなので、もう少しformulaを見て、他の要素も見ていく予定。
長くなってきたのでこのあたりで。
Enjoy!!
-
たぶん。常に成り立つよね…?↩