R语言reduce与do.call对单元素列表的处理差异及reduce使用咨询
问题原因
purrr的reduce默认逻辑为:当输入列表长度为1时,直接返回列表内的第一个元素,不会执行拼接操作,因此单元素场景下你拿到的是长度为3的数值向量,而非1行3列的矩阵;do.call(rbind, 列表)则无论列表长度为1还是更长,都会统一执行rbind操作,返回矩阵结构,结果符合预期。
解决方案
给reduce指定.init参数,初始值设为NULL即可,无论输入列表长度是多少,都会走完完整拼接逻辑,最终结果和do.call完全一致。
通用写法如下:
reduce(待拼接列表, rbind, .init = NULL)
单元素场景验证
library(purrr) test1 <- 1 map_l1 <- map(test1, ~ .x*c(1,2,3)) # 调整后的reduce写法 r1_fix <- reduce(map_l1, rbind, .init = NULL) # 与do.call结果对比 identical(r1_fix, do.call("rbind", map_l1)) # 输出:[1] TRUE
多元素场景验证
test2 <- c(1,2) map_l2 <- map(test2, ~ .x*c(1,2,3)) r2_fix <- reduce(map_l2, rbind, .init = NULL) identical(r2_fix, do.call("rbind", map_l2)) # 输出:[1] TRUE
内容的提问来源于stack exchange,提问作者dorit
相关产品推荐
相关产品推荐

