備忘ログ

チラシの裏的備忘録&メモ

R 4.2.0の`as.vector()`

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 enable as.vector(<data.frame>, mode="list"). This breaks code relying on as.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!”

is.vector(as.vector(mtcars)) #> [1] FALSE

っていうのがあってそいうのをネタにしようと思ったのに。

ただ、FIXされるのはよいことだ。