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

Kon*_*rad 1 functional-programming r higher-order-functions purrr

给定样本字符串:

tst_str <- c("abc", "123", "klm", "lop")
Run Code Online (Sandbox Code Playgroud)

我想做以下替换:

  • abc -> za12
  • 123 -> poi
  • klm -> uyt

期望的结果

简单的嵌套嵌套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" 
Run Code Online (Sandbox Code Playgroud)

问题

我想使用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
)
Run Code Online (Sandbox Code Playgroud)

显然,这不是正确的方法:

警告消息:在gsub中(pattern = x,replacement = y,x = init):
参数'pattern'的长度> 1,只使用第一个元素


笔记

and*_*ece 5

你有正确的想法,尝试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" 
Run Code Online (Sandbox Code Playgroud)

需要注意的是.freduce2()仅仅需要一个函数,有3个参数.你实际上不必明确地传递它们,reduce将照顾它.

或者(虽然不是更高阶):

names(replacements) <- patterns
str_replace_all(tst_str, replacements)
Run Code Online (Sandbox Code Playgroud)