代码之家  ›  专栏  ›  技术社区  ›  Konrad

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

  •  1
  • Konrad  · 技术社区  · 6 年前

    给定的示例字符串:

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

    我想进行以下替换:

    • 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" 
    

    问题

    我想用 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
    )
    

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

    警告消息:在gsub(pattern=x,replacement=y,x=init)中:
    参数“pattern”的长度为1,只有第一个元素 习惯于


    笔记

    1 回复  |  直到 6 年前
        1
  •  5
  •   andrew_reece    6 年前

    你有正确的想法,试试看 reduce2 具有 stringr::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" 
    

    注意 .f 在里面 reduce2() 只是 requires 接受3个参数的函数。实际上你不需要明确地把它们传进来, reduce 会处理好的。

    交替(尽管不是高阶):

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