我想将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"


这是几次尝试使用accumulatereduce2类似的尝试。没有一个正确地遍历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"


如何使用accumulate查看reduce2示例给出的中间结果?

最佳答案

这可能是疏忽之处,因为文档根本不是最新的/有点误导?我也无法让accumulate接受三个参数的函数,我很惊讶您的上一个示例中没有错误,尽管我猜必须是paste会抛出该错误。 .f的文本与accumulate的文本完全相同,这一事实使我认为这不是reduce中的功能。另外,查看源代码似乎表明(除非我误读了)accumulatereduce有其自己的实现,但reduce2依赖于accumulate。可能值得GitHub问题。

这是产生所需输出的最佳方法。它基本上涉及用输入列表的正确子集和base::Reduce的辅助输入向量多次调用reduce2,感觉不太整洁。这可能不是一个特别整洁或整洁的问题。请注意,使用paste2来覆盖默认的{}行为,即将管道LHS放置为第一个参数,并在%>%中对.x.y进行不同的索引编制(我们要保留reduce2.y短一个元素)。



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"


reprex package(v0.2.0)于2018-05-11创建。

10-08 07:54