如何在purrr中像reduce2函数一样使用accumulate函数?
如何用accumulate查看reduce2的中间结果?
哈哈,我懂你的需求——你想看到reduce2执行过程中的每一步中间结果,但用普通的accumulate怎么试都不对对吧?其实你需要的是**accumulate2**,它就是purrr包里专门对应reduce2的累积版本!
核心解决方案:用accumulate2替代accumulate
reduce2对应accumulate2,就像reduce对应accumulate。accumulate2专门用来处理需要两个输入向量的累积操作,参数逻辑和reduce2完全一致。
先复用你定义的paste2函数:
paste2 <- function(x, y, sep = ".") paste(x, y, sep = sep)
然后用accumulate2实现你的需求:
library(purrr) letters[1:4] %>% accumulate2(.y = c("-", ".", "-"), .f = paste2)
运行后会得到完整的中间结果:
[[1]] [1] "a" [[2]] [1] "a-b" [[3]] [1] "a-b.c" [[4]] [1] "a-b.c-d"
这个结果完美展示了reduce2从初始值到最终结果的每一步操作:
- 第一步:初始值
"a" - 第二步:用
"a"、letters[2](即"b")和.y[1](即"-")调用paste2,得到"a-b" - 第三步:用
"a-b"、letters[3](即"c")和.y[2](即".")调用paste2,得到"a-b.c" - 第四步:用
"a-b.c"、letters[4](即"d")和.y[3](即"-")调用paste2,得到最终的"a-b.c-d"
为什么你之前的尝试不对?
咱们来拆解下你之前的错误:
- 第一个尝试
accumulate(.y=c("-", ".", "-"),paste2):accumulate本身没有.y参数,所以直接报错提示有未使用的参数。 - 第二个尝试
accumulate(c("-", ".", "-"),paste2):accumulate的第二个参数要求是函数,你把向量传进去当成了函数,自然得到混乱的结果。 - 第三个尝试
accumulate(sep=c("-", ".", "-"),paste2):这里sep被当成了paste2的固定参数,但paste2的sep只接受单个值,所以它会循环取向量的第一个元素"-",导致每次都用"-"连接,结果不符合你的预期。
关键注意点
使用accumulate2时,.y向量的长度必须比.x向量少1,这样每一步的操作才能一一对应(就像reduce2的要求一样)。
内容的提问来源于stack exchange,提问作者Steve
相关产品推荐
相关产品推荐

