potisanのプログラミングメモ

プログラミング素人です。昔の自分を育ててくれたネット情報に少しでも貢献できるよう、情報を貯めていこうと思っています。Windows環境のC++やC#がメインです。

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関数を使うことです。

C++C#では数値リテラルの型がある程度推論されるので、それに慣れていると戸惑う仕様です。

参考: