使用 purrr::reduce2 复制嵌套 gsub 调用的行为
Using purrr::reduce2 to replicate behaviour of nested gsub calls
给定的示例字符串:
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
)
显然这不是正确的做法:
Warning message: In gsub(pattern = x, replacement = y, x = init) :
argument 'pattern' has length > 1 and only the first element will be
used
备注
解决方案必须基于purrr::
or other Higher Order Function
do.call
也可以
问题不实用; multigsub
和类似的功能可以轻松解决此类任务。
你的想法是对的,试试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"
请注意 reduce2()
中的 .f
只是 requires 一个接受 3 个参数的函数。您实际上不必显式传递它们,reduce
会处理。
交替(虽然不是高阶):
names(replacements) <- patterns
str_replace_all(tst_str, replacements)
给定的示例字符串:
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
)
显然这不是正确的做法:
Warning message: In gsub(pattern = x, replacement = y, x = init) :
argument 'pattern' has length > 1 and only the first element will be used
备注
解决方案必须基于
purrr::
or other Higher Order Functiondo.call
也可以
问题不实用;
multigsub
和类似的功能可以轻松解决此类任务。
你的想法是对的,试试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"
请注意 reduce2()
中的 .f
只是 requires 一个接受 3 个参数的函数。您实际上不必显式传递它们,reduce
会处理。
交替(虽然不是高阶):
names(replacements) <- patterns
str_replace_all(tst_str, replacements)