R 4.2.0からas.vector()
の結果が微妙に変わって、
as.vector(iris) |> is.vector()
## [1] TRUE
というあたり前田のクラッカーな結果になるようになった。
なにも知らなければだからどうしたという結果だが、R
4.1.xまではこれがFALSE
になっていて、as.vector()
してるのにis.vector()
がTRUE
にならないという、Rワケガワカラナイヨ案件だった。
R 4.2.0のNEWSの
as.vector()
gains a data.frame method which returns a simple named list, also clearing a long standing ‘FIXME’ to enableas.vector(<data.frame>, mode="list")
. This breaks code relying onas.vector(<data.frame>)
to return the unchanged data frame.
っていうのだと思う。
R 4.2.0のリリースノートを眺めてみるのYOUTUBEライブでもこのこと話されていたがその時は意味がわからなかった。
そもそも、RのベクトルはHadley Wickham氏のAdvanced R(邦訳:R言語徹底解説)にもあるようにベクトルはベクトルであるだけでなくリストでもあるという、ワケガワカラナイヨ案件のひとつ。
一次元構造のベクトルはis.atomic()
で判定する必要があり、一次元構造のベクトルにしたかったらas.vector()
じゃなくて、unlist()
する必要がある。
as.vector(iris) |> is.atomic()
## [1] FALSE
unlist(iris) |> is.atomic()
## [1] TRUE
全然ワケガワカラナイヨ(わかる)。
なんでこんなこと書いたかというは今月何も書いてないなと思って、データフレームにas.vector()
にis.vector()
してもFALSE
になるのでRワケガワカラナイヨみたいな記事を書こうと思ったら、思惑が外れR
4.2.0でFIXされたのか~、とびっくりしたということをメモしておこうとおもったから。
Advanced R SolutionsっていうAdvanced Rのexerciseの解答集に
Note that as.vector() and is.vector() use different definitions of “vector!”
っていうのがあってそいうのをネタにしようと思ったのに。
ただ、FIXされるのはよいことだ。