3

给定一个我想替换的具有不同占位符的字符串,R 是否有一个函数可以在给定模式向量和替换向量的情况下替换所有这些占位符?

我已经设法通过一个列表和一个循环来实现这一点

> library(stringr)    
> tt_ori <- 'I have [%VAR1%] and [%VAR2%]'
> tt_out <- tt_ori

> ttlist <- list('\\[%VAR1%\\]'="val-1", '\\[%VAR2%\\]'="val-2")
> ttlist
$`\\[%VAR1%\\]`
[1] "val-1"

$`\\[%VAR2%\\]`
[1] "val-2"

> for(var in names(ttlist)) {
+ print(paste0(var," -> ",ttlist[[var]]))
+ tt_out <- stringr::str_replace_all(string = tt_out, pattern =var, replacement = ttlist[[var]] )
+ }
[1] "\\[%VAR1%\\] -> val-1"
[1] "\\[%VAR2%\\] -> val-2"
> tt_out
[1] "I have val-1 and val-2"

有一个类似的问题R:gsub,模式=向量和替换=向量但它要求仅用一种模式替换不同的字符串。在这里,我正在寻找替换单个字符串中的所有模式。

我努力了

> tt_ori <- 'I have VAR1 and VAR2'
> tt_out <- tt_ori
> ttdf <- data.frame(tt=c("VAR1", "VAR2"), val=c("val-1", "val-2"), stringsAsFactors = F)
> str(ttdf)
'data.frame':   2 obs. of  2 variables:
 $ tt : chr  "VAR1" "VAR2"
 $ val: chr  "val-1" "val-2"
> stringr::str_replace_all(string = tt_out, pattern =ttdf$tt, replacement = ttdf$val )
[1] "I have val-1 and VAR2" "I have VAR1 and val-2"

显然输出不是我想要的(几个输出字符串,每个只有一个替换)。

我想知道一个函数是否存在于 base 或一个众所周知的 CRAN 包中,它会像前面显示的那样被调用,并且能够在单个字符串中进行所有替换。

有人对我的循环有更好的解决方案或建议,还是应该将其转换为函数?

[注意] 字符串可以是小型网页模板,o 配置文件。它们很小,因此循环进行 10 或 20 次替换并不是什么大问题,但我正在寻找更优雅的解决方案。

4

2 回答 2

1

尝试

library(qdap)
 mgsub(c('[%VAR1%]' , '[%VAR2%]'), c('val-1', 'val-2'), tt_ori)
#[1] "I have val-1 and val-2"

数据

 tt_ori <- 'I have [%VAR1%] and [%VAR2%]'
于 2015-02-15T18:56:20.363 回答
0

这似乎达到了你所需要的。

tt_ori <- 'I have [%VAR1%] and [%VAR2%]'
patterns <- c('\\[%VAR1%\\]', '\\[%VAR2%\\]')
replacements <- c("val-1", "val-2")

stringr::str_replace_all(tt_ori, set_names(replacements, patterns))
# [1] "I have val-1 and val-2"
于 2022-01-12T16:25:57.717 回答