我怎样才能像purrr中的reduce2函数一样使用accumulate?

Ste*_*eve 6 r purrr tidyverse

我想使用accumulate具有两个输入向量和reduce2函数的函数。的文档accumulate暗示可以给出两个输入向量并且accumulate可以与 一起使用reduce2。但是,我遇到了麻烦。

这是一个示例,灵感来自 的文档reduce2

这是来自的示例reduce2

> paste2 <- function(x, y, sep = ".") paste(x, y, sep = sep)
> letters[1:4] %>% reduce2(.y=c("-", ".", "-"), paste2)
[1] "a-b.c-d"
Run Code Online (Sandbox Code Playgroud)

accumulate这里有一些类似使用的尝试reduce2。没有一个能够正确地遍历letters[1:4]c("-",".","-")

> letters[1:4] %>% accumulate(.y=c("-", ".", "-"),paste2)
Error in .f(x, y, ...) : unused argument (.y = c("-", ".", "-"))

> letters[1:4] %>% accumulate(c("-", ".", "-"),paste2)
[[1]]
[1] "a"

[[2]]
NULL

> letters[1:4] %>% accumulate(sep=c("-", ".", "-"),paste2)
[1] "a"       "a-b"     "a-b-c"   "a-b-c-d"
Run Code Online (Sandbox Code Playgroud)

我将如何查看示例accumulate给出的中间结果reduce2

Cal*_*You 1

这可能是一个疏忽,文档根本不是最新的/有点误导?我也无法accumulate接受三参数函数,而且我很惊讶你的最后一个例子中没有错误,尽管我猜它一定会paste抛出它。事实上, for 的文本与 for.f完全相同,这让我认为这不是 中存在的功能。此外,查看源代码似乎表明(除非我误读)并且有自己的实现,但依赖于. 可能值得在 GitHub 上发布一个问题。accumulatereduceaccumulatereducereduce2accumulatebase::Reduce

这是我产生您想要的输出的最佳方法。它基本上涉及reduce2使用输入列表的右子集和 的辅助输入向量多次调用paste2,这感觉不太整洁。这可能不是一个特别整洁的问题。请注意使用 来覆盖将管道 LHS 作为第一个参数的{}默认行为,以及内部和内部的不同索引(我们希望保留一个元素比 短)。%>%.x.yreduce2.y.x

paste2 <- function(x, y, sep = ".") paste(x, y, sep = sep)

library(purrr)
letters[1:4] %>%
  {map_chr(
    .x = 2:length(.),
    .f = function(index) reduce2(
      .x = .[1:index],
      .y = c("-", ".", "-")[1:(index - 1)],
      .f = paste2
    )
  )}
#> [1] "a-b"     "a-b.c"   "a-b.c-d"
Run Code Online (Sandbox Code Playgroud)

由reprex 包(v0.2.0)于 2018 年 5 月 11 日创建。