niszetの日記

アナログCMOS系雑用エンジニアが頑張る備忘録系日記

(R) formulaをView()してみてみる(1回目)

quote, substitute, language, symbol, name, expression, formula, quo, enquo あたりを見ていく予定。長くなりそう。

これの続き。 niszet.hatenablog.com

実際に見てみる。

たとえば、こういう感じである。

View(a~b~c~d)

f:id:niszet:20180401220251p:plain

a~b~c~dformulaであるが、階層構造となっていて~, a~b~c, dに分解されている。a~b~cはさらに分解されて、最終的には~, a, b に分解される。

また、formulaattributesを持っていて、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

となる。symbolnameともいわれるが、それは

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

ちなみに、languageformulaではない。

plyr::is.formula((a~b~c~d)[[2]][[2]][2])
#> [1] FALSE

ただし、formulalanguageである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!!


  1. たぶん。常に成り立つよね…?