【发布时间】:2018-11-07 12:23:39
【问题描述】:
给定示例字符串:
tst_str <- c("abc", "123", "klm", "lop")
我想进行以下替换:
abc -> za12123 -> poiklm -> 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,只有第一个元素是 用过
注意事项
-
解决方案必须基于
purrr::或其他Higher Order Function-
do.call也可以
-
这个问题不实用;
multigsub和类似功能可以轻松解决此类任务。
【问题讨论】:
-
这可能是有用的阅读。一个完全不酷的
for循环(或者Reduce变体,如果你有 使用高阶函数)非常高效且简洁 - stackoverflow.com/questions/26171318/… -
@thelatemail 谢谢你,这是个好方法。基准测试结果也很有用。
标签: r functional-programming higher-order-functions purrr