关于purrr::pluck()与purrr::map()搭配double类型参数的行为疑问
关于purrr包pluck()和map()函数特殊参数行为的解释
此问题关联Hadley Wickham所著《Advanced R》9.2.6章节练习2
问题场景
以下代码的运行结果让人困惑:
# pluck with index of type `double` pluck(1:3, -2.3456) # returns 1 pluck(1:3, 2.9876) # returns 2 # map with vector of type `double` map(1:3, runif(2)) # returns list(1, 2, 3)
一、pluck()处理double类型索引的逻辑
purrr的pluck()在接收非整数类型的索引时,会直接截断小数部分,只保留整数部分作为实际使用的索引:
- 对于
-2.3456,截断后得到整数-2,表示从向量末尾倒数第2个位置取值。原向量1:3的倒数第2个元素是第1位的1,因此返回1。 - 对于
2.9876,截断后得到整数2,对应向量第2位的元素2,因此返回2。
这里的转换规则是直接丢弃小数位,并非四舍五入,是pluck()内部处理索引的默认逻辑。
二、map()传入double向量参数的逻辑
map()的第二个参数如果不是函数,会被当作元素提取的索引来使用。runif(2)生成的是两个0到1之间的double值(比如c(0.3, 0.7)),这些值都小于向量的最小有效索引1。
当map()遇到无效索引(小于1或大于向量长度)时,会直接返回原输入的元素。所以map(1:3, runif(2))中,每个输入元素(1、2、3)对应的索引都无效,最终返回原元素组成的列表list(1, 2, 3)。
内容的提问来源于stack exchange,提问作者kingddd
相关产品推荐
相关产品推荐

