purrr :: map_int: Невозможно привести элемент 1 от двойного к целому - PullRequest
1 голос
/ 28 марта 2019

У меня самая странная ошибка с map_int из пакета purrr.

# Works as expected
purrr::map_int(1:10, function(x) x)
#>  [1]  1  2  3  4  5  6  7  8  9 10

# Why on earth is that not working?
purrr::map_int(1:10, function(x) 2*x)
#> Error: Can't coerce element 1 from a double to a integer

# or that?
purrr::map_int(1:10, round)
#> Error: Can't coerce element 1 from a double to a integer

Создано в 2019-03-28 пакетом Представить (v0.2.1)

Я запускаю 3.5.2 в рокереконтейнер (Debian) с последней версией github всего:

sessioninfo::package_info("purrr")
#>  package  * version    date       lib source                             
#>  magrittr   1.5.0.9000 2019-03-28 [1] Github (tidyverse/magrittr@4104d6b)
#>  purrr      0.3.2.9000 2019-03-28 [1] Github (tidyverse/purrr@25d84f7)   
#>  rlang      0.3.2.9000 2019-03-28 [1] Github (r-lib/rlang@9376215)       
#> 
#> [1] /usr/local/lib/R/site-library
#> [2] /usr/local/lib/R/library

Ответы [ 2 ]

4 голосов
/ 28 марта 2019

2*x не является целым числом, потому что 2 не является.Делай вместо

purrr::map_int(1:10, function(x) 2L*x)
3 голосов
/ 28 марта 2019

В документации от help(map) написано

Вывод .f будет автоматически набираться вверх, например логично -> целое число -> двойной -> символ

По-видимому, он следует большему порядку, указанному в help(c). Например, это выдает ошибку map_dbl(1:10, ~complex(real = .x, imaginary = 1)).

NULL

Как вы можете видеть в этом порядке, двойное в целое число является нисходящим преобразованием. Итак, функция предназначена для того, чтобы не делать такого рода преобразования.

Решение состоит в том, чтобы либо написать функцию .f, которая выводит целочисленные (или более низкие) классифицированные объекты (как в ответе @ Stéphane Laurent), либо просто использовать as.integer(map(.x, .f)).

Это разновидность проверки типов , которая может быть полезной для предотвращения ошибок программирования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...