使用 purrr::reduce2 复制嵌套 gsub 调用的行为

Using purrr::reduce2 to replicate behaviour of nested gsub calls

给定的示例字符串:

tst_str <- c("abc", "123", "klm", "lop")

我想进行以下替换:

想要的结果

gsub 调用的简单嵌套提供了结果:

gsub(
    pattern = "abc",
    replacement = "za12",
    x = gsub(
        pattern = "123",
        replacement = "poi",
        x = gsub(
            pattern = "klm",
            replacement = "uyt",
            x = tst_str
        )
    )
)
# [1] "za12" "poi"  "uyt"  "lop" 

问题

我想使用 purrr::map*purrr::reduce 函数得到相同的结果。我最初的想法是利用 purrr::reduce2

purrr::reduce2(
    .x = c("abc", "123", "klm"),
    .y = c("za12", "poi", "uyt"),
    .f = function(x, y, init) {
        gsub(pattern = x,
             replacement = y,
             x = init)
    },
    .init = tst_str
)

显然这不是正确的做法:

Warning message: In gsub(pattern = x, replacement = y, x = init) :
argument 'pattern' has length > 1 and only the first element will be used


备注

你的想法是对的,试试reduce2stringr::str_replace():

library(purrr)
library(stringr)

tst_str <- c("abc", "123", "klm", "lop")
replacements <- c("za12", "poi", "uyt")
patterns <-  c("abc", "123", "klm")
reduce2(patterns, replacements, str_replace, .init=tst_str)

[1] "za12" "poi"  "uyt"  "lop" 

请注意 reduce2() 中的 .f 只是 requires 一个接受 3 个参数的函数。您实际上不必显式传递它们,reduce 会处理。

交替(虽然不是高阶):

names(replacements) <- patterns
str_replace_all(tst_str, replacements)