我在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
答案 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,对于防止编程错误很有用。