我想将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"
这是几次尝试使用
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"
如何使用
accumulate
查看reduce2
示例给出的中间结果? 最佳答案
这可能是疏忽之处,因为文档根本不是最新的/有点误导?我也无法让accumulate
接受三个参数的函数,我很惊讶您的上一个示例中没有错误,尽管我猜必须是paste
会抛出该错误。 .f
的文本与accumulate
的文本完全相同,这一事实使我认为这不是reduce
中的功能。另外,查看源代码似乎表明(除非我误读了)accumulate
和reduce
有其自己的实现,但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创建。