potisanのプログラミングメモ

趣味のプログラマーがプログラミング関係で気になったことや調べたことをいつでも忘れられるようにメモするブログです。はてなブログ無料版なので記事の上の方はたぶん広告です。記事中にも広告挿入されるみたいです。

R&tidyverse purrr::map_intが単純な足し算で失敗する理由

purrr::map_int関数が単純な足し算で失敗したとき、数値リテラルの型が原因かもしれません。

次のコードで(1)はエラー、(2)は成功します。違いは足す数が11Lかです。

require(purrr)

1:10 %>% map_int(~.x+1)
#> Error: Can't coerce element 1 from a double to a integer
1:10 %>% map_int(~.x+1L)
#> [1]  2  3  4  5  6  7  8  9 10 11

原因はRの数値リテラルサフィックスなしでdouble型であることです。これは次のコードで確かめられます。

typeof(1)  # [1] "double"
typeof(1L) # [1] "integer"

purrr::map_int関数は戻り値をinteger型に制限しているので、~.+1の結果がdouble型となることからエラーとなります。解決策は上記コードのように1Lサフィックスで型指定するか、purrr::map_dbl関数を使うことです。

参考: - https://stackoverflow.com/questions/55397509/purrrmap-int-cant-coerce-element-1-from-a-double-to-a-integer - 3.1.1 Constants - R Language Definition - purrr::map - tidyverse