【问题标题】:Using purrr::reduce2 to replicate behaviour of nested gsub calls使用 purrr::reduce2 复制嵌套 gsub 调用的行为
【发布时间】:2018-11-07 12:23:39
【问题描述】:

给定示例字符串:

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

我想进行以下替换:

  • abc -&gt; za12
  • 123 -&gt; poi
  • klm -&gt; 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) 中:
参数“模式”的长度 > 1,只有第一个元素是 用过


注意事项

【问题讨论】:

  • 这可能是有用的阅读。一个完全不酷的for 循环(或者Reduce 变体,如果你 使用高阶函数)非常高效且简洁 - stackoverflow.com/questions/26171318/…
  • @thelatemail 谢谢你,这是个好方法。基准测试结果也很有用。

标签: r functional-programming higher-order-functions purrr


【解决方案1】:

你的想法是对的,试试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)

【讨论】:

    猜你喜欢
    • 2017-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-17
    • 2020-08-24
    • 1970-01-01
    • 2018-12-24
    • 1970-01-01
    相关资源
    最近更新 更多