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

purrr::map_int:无法将元素1从双精度强制为整数,r,purrr,R,Purrr,我有一个最奇怪的错误,来自purrr包的map_int 工作如期进行 purrr::map_int1:10,functionx > [1] 1 2 3 4 5 6 7 8 9 10 这到底为什么不起作用? purrr::map_int1:10,functionx 2*x >错误:无法将元素1从双精度强制为整数 还是那样? purrr::地图1:10,圆形 >错误:无法将元素1从双精度强制为整数 由v0.2.1于2019-03-28创建 我在rocker容器Debian中运行3

我有一个最奇怪的错误,来自purrr包的map_int

工作如期进行 purrr::map_int1:10,functionx > [1] 1 2 3 4 5 6 7 8 9 10 这到底为什么不起作用? purrr::map_int1:10,functionx 2*x >错误:无法将元素1从双精度强制为整数 还是那样? purrr::地图1:10,圆形 >错误:无法将元素1从双精度强制为整数 由v0.2.1于2019-03-28创建

我在rocker容器Debian中运行3.5.2,并使用最新的github版本:

sessioninfo::package\u InfoPurr >包*版本日期库源 >magrittr 1.5.0.9000 2019-03-28[1]Github tidyverse/magrittr@4104d6b >purrr 0.3.2.9000 2019-03-28[1]吉特胡布-蒂迪维尔/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*x不是整数,因为2不是。取而代之

purrr::map_int(1:10, function(x) 2L*x)
2*x不是整数,因为2不是。取而代之

purrr::map_int(1:10, function(x) 2L*x)
helpmap中的文档显示

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

它似乎遵循helpc中给出的较大顺序。例如,这将生成一个错误映射_dbl1:10,~complexreal=.x,invential=1

NULL 正如您在该顺序中所看到的,double到integer是向下转换。因此,该函数设计为不进行这种转换

解决方案是编写一个函数.f,输出整数或低级对象,如@Stéphane Laurent的答案所示,或者只使用.integermap.x、.f

这是一种非常有用的功能,可以用来防止编程错误。

helpmap的文档中说

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

它似乎遵循helpc中给出的较大顺序。例如,这将生成一个错误映射_dbl1:10,~complexreal=.x,invential=1

NULL 正如您在该顺序中所看到的,double到integer是向下转换。因此,该函数设计为不进行这种转换

解决方案是编写一个函数.f,输出整数或低级对象,如@Stéphane Laurent的答案所示,或者只使用.integermap.x、.f


这是一种非常有用的功能,可以用来防止编程错误。

你能试试map\u dbl吗?文档上说map\u lgl、map\u int、map\u dbl和map\u chr都返回一个指定类型的原子向量,或者。。看起来他们并没有尽力:,但我相信这是意料之中的,你可以使用purrr::map_chr1:10,functionx 2*x,因为你会强制到一个更一般的类型,也就是说转换总是有效的,在这里你希望一个double被强制到整数2是一个double,所以结果也是一样的,而且purrr::map_int甚至不想尝试检查所有值。@Moody_mudscapper就我而言,这是一个bug。正如您所说,它与执行隐式转换的所有其他映射函数都不一致!考虑PURR::MAPYDF1:10,函数X Lista=2×X工作。purrr::map_chr1:10,functionx也是如此。在我的实际用例中,我使用floor,而不得不使用as.integer会破坏整个要点。你可以争辩说,这种特殊的强制转换会导致信息丢失,但为什么允许从双精度隐式转换为字符,这会在转换回数字时导致精度损失?@IceCreamToucan是的,在反射时,这是有意义的。但是非常有限,考虑到返回数值的函数的数量,即使是整数,例如round、floor等。您可以尝试使用map_dbl吗?doc说map_lgl、map_int、map_dbl和map_chr都返回指定类型的原子向量,或者尝试。。看起来他们并没有尽力:,但我相信这是意料之中的,你可以使用purrr::map_chr1:10,functionx 2*x,因为你会强制到一个更一般的类型,也就是说转换总是有效的,在这里你希望一个double被强制到整数2是一个double,所以结果也是一样的,而且purrr::map_int甚至不想尝试检查所有值。@Moody_mudscapper就我而言,这是一个bug。正如您所说,它与执行隐式转换的所有其他映射函数都不一致!考虑PURR::MAPYDF1:10,函数X Lista=2×X工作。purrr::map_chr1:10,functionx也是如此。在我的实际用例中,我使用floor,而不得不使用as.integer会破坏整个要点。你可以说这种特殊的类型转换会导致信息丢失,但是为什么允许从double到character的隐式类型转换,这会导致pre的丢失呢
当我们回过头来看数字时,我们会有什么犹豫?@IceCreamToucan是的,在反思中,这是有意义的。但是,考虑到返回数值的函数的数量非常有限,即使是整数,例如round、floor等。这与执行隐式转换的所有其他映射函数都不一致!不能强制从一个双精度到一个整数是真的不想。。。。考虑PURR::MAPYDF1:10,函数X Lista=2×X工作。purrr::map_chr1:10,functionx也是如此。在我的实际用例中,我使用floor,而不得不使用as.integer会破坏整个要点。当然。这与执行隐式转换的所有其他映射函数都不一致!不能强制从一个双精度到一个整数是真的不想。。。。考虑PURR::MAPYDF1:10,函数X Lista=2×X工作。purrr::map_chr1:10,functionx也是如此。在我的实际用例中,我使用floor,而不得不使用as.integer会破坏整个要点。