如何在 .f 中编写带有附加参数的 purrr::reduce 函数

Jas*_*lns 3 r purrr

考虑这个简单的例子,它从字符串向量中累积单词“This”的出现次数:

library(purrr)
library(stringr)

sentences <- c("This is a sentence.",
               "This is another sentence.",
               "One more This")

reduce(str_count(sentences, "This"), `+`)         # SUCCESS! Returns 3
Run Code Online (Sandbox Code Playgroud)

我试图了解如何通过sentences传递到reduce--我失败的尝试来编写此内容:

reduce(sentences, str_count, pattern = "This")          # FAILS! unused argument (.x[[i]])
reduce(sentences, ~ str_count, pattern = "This")        # FAILS! Returns signature for str_count()
reduce(sentences, ~ str_count(pattern = "This"))        # FAILS! Argument "string" missing with no default.
reduce(sentences, ~ str_count("This"))                  # FAILS! Returns wrong result, 4.
reduce(sentences, ~ str_count(.x, pattern = "This") + str_count(.y, pattern = "This"))    # FAILS! Returns wrong result, 1.
Run Code Online (Sandbox Code Playgroud)

编辑:为了更清楚,考虑一种Python方法:

reduce(lambda a, x: a + x.count("This"), sentences, 0) 
Run Code Online (Sandbox Code Playgroud)

我对类似的方法感兴趣R,但我不确定这是否可能(?),因为.countPython.

mar*_*dly 5

如果本练习的目的是展示如何从reduce 内部传递参数,str_count那么您可以这样做:

reduce(sentences, function(x, y, p) x + str_count(y, p), p = "This", .init = 0)
#> [1] 3
Run Code Online (Sandbox Code Playgroud)

尽管我认为评论中现有的建议是实现相同结果的更具可读性的方式。展示如何传递附加参数的一种更简单的方法是使用类似于str_c将字符串作为参数并返回字符串作为结果的函数。

reduce(sentences, str_c, sep = "___")
#> [1] "This is a sentence.___This is another sentence.___One more This"

reduce(sentences, str_c, sep = "___") %>% str_count("This")
#> [1] 3
Run Code Online (Sandbox Code Playgroud)