purrr :: map_int:无法将元素1从双精度转换为整数

时间:2019-03-28 12:21:26

标签: r purrr

我在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

reprex package(v0.2.1)于2019-03-28创建

我使用最新的github版本在摇臂容器(Debian)中运行3.5.2:

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 个答案:

答案 0 :(得分:4)

2*x不是整数,因为2不是整数。代替

purrr::map_int(1:10, function(x) 2L*x)

答案 1 :(得分:3)

help(map)中的文档说

  

.f的输出将自动向上键入,例如逻辑->   整数->双精度->字符

它似乎遵循help(c)中给出的较大顺序。例如,这将产生错误map_dbl(1:10, ~complex(real = .x, imaginary = 1))

  

NULL <原始<逻辑<整数<双<复数<字符<列表<   表达

如您在该顺序中看到的,双精度整数是向下转换。因此,该函数被设计为不执行这种转换。

解决方案是编写一个函数.f来输出整数(或更低)的分类对象(如@StéphaneLaurent的回答),或者只使用as.integer(map(.x, .f))

这是一种type-checking,对于防止编程错误很有用。