Kon*_*rad 1 functional-programming r higher-order-functions purrr
给定样本字符串:
tst_str <- c("abc", "123", "klm", "lop")
Run Code Online (Sandbox Code Playgroud)
我想做以下替换:
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"
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,只使用第一个元素
你有正确的想法,尝试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"
Run Code Online (Sandbox Code Playgroud)
需要注意的是.f在reduce2()仅仅需要一个函数,有3个参数.你实际上不必明确地传递它们,reduce将照顾它.
或者(虽然不是更高阶):
names(replacements) <- patterns
str_replace_all(tst_str, replacements)
Run Code Online (Sandbox Code Playgroud)