给定一个包含我想要替换的不同占位符的字符串,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, pattern = vector and replacement = vector,但它要求用每个模式替换不同的字符串。在这里,我正在寻找替换单个字符串中的所有模式。
我试过了
> 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包中,它将像之前显示的那样被调用,并且能够在单个字符串中进行所有替换。
有人为我的循环提供了更好的解决方案或推荐,还是应该将其转换为函数?
[注意]字符串可以是小网页模板,配置文件。它们很小,所以制作一个10或20个替换的循环并不是什么大问题,但我正在寻找更优雅的解决方案。
答案 0 :(得分: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%]'