如果有一个包含不同占位符的字符串需要替换,那么在 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"
显然,输出不是我想要的(多个输出字符串,每个字符串仅有一个替换)。我在想是否有一个函数存在于基础库或众所周知的CRAN包中,可以像上面展示的那样被调用,并且能够在单个字符串中完成所有替换。你是否有更好的解决方案或建议我的循环或者应该将其转换为函数?[注]这些字符串可能是小型网页模板或配置文件。它们很小,因此对于10到20个替换而言,使用循环并不困难,但我正在寻找更优雅的解决方案。
tt_ori
зҡ„tt_out
пјҢйӮЈд№Ҳmgsub
еә”иҜҘдҪҝз”Ёmgsub(c('[%VAR1%]' , '[%VAR2%]'), c('val-1', 'val-2'), tt_ori)
гҖӮ - akrun