R中的replace字符串,给出模式向量和替换向量

R中的replace字符串,给出模式向量和替换向量,r,stringr,qdap,R,Stringr,Qdap,给定一个包含不同占位符的字符串,如果给定一个模式向量和替换向量,R是否有一个函数来替换所有占位符 我通过一个列表和一个循环成功地实现了这一点 > library(stringr) > tt_ori <- 'I have [%VAR1%] and [%VAR2%]' > tt_out <- tt_ori > ttlist <- list('\\[%VAR1%\\]'="val-1", '\\[%VAR2%\\]'="val-2") > tt

给定一个包含不同占位符的字符串,如果给定一个模式向量和替换向量,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"
>库(stringr)
>TTU或TTU输出ttlist ttlist
$`\\[%VAR1%\\]`
[1] “val-1”
$`\\[%VAR2%\\]`
[1] “val-2”
>用于(名称中的var(ttlist)){
+打印(粘贴0(变量“->”,ttlist[[var]]))
+吐吐吐吐吐吐吐吐吐吐吐吐吐吐吐吐吐吐吐吐吐吐吐吐吐吐吐吐吐吐吐吐吐吐吐吐吐吐吐吐吐吐吐吐吐吐吐吐吐吐吐吐吐吐吐吐吐吐
[1] “我有val-1和val-2”
有一个类似的问题,但它要求用一个模式替换不同的字符串,这里我要替换单个字符串中的所有模式

我试过了

> 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"
>tt_ori tt_out ttdf str(ttdf)
“data.frame”:2个变量中的2个对象:
$tt:chr“VAR1”和“VAR2”
$val:chr“val-1”和“val-2”
>stringr::str_replace_all(string=tt_out,pattern=ttdf$tt,replacement=ttdf$val)
[1] “我有val-1和VAR2”“我有VAR1和val-2”
显然,输出不是我想要的(几个输出字符串,每个字符串只有一个替换)

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

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

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

试试看

library(qdap)
 mgsub(c('[%VAR1%]' , '[%VAR2%]'), c('val-1', 'val-2'), tt_ori)
#[1] "I have val-1 and val-2"
数据
tt_ori如果您的预期输出是基于输入的
tt_ori
mgsub
应该工作
mgsub(c('[%VAR1%]','[%VAR2%]',c('val-1','val-2'),tt_ori)
@akrun您在qdap?中谈论mgsub的地方。查找它,我刚刚找到了一些mgsub功能实现的链接。如果您将注释写为答案,我将接受it@akrun,您之前评论中的@指向其他Pablo;-)我没有在mgsub之前尝试,因为我没有安装qdap。我看到了但是他们说它有很多依赖项,在回答中,他们将mgsub命令等效为
names(x1),感谢我安装了qdap及其所有依赖项
>install.packages('qdap'))同时安装依赖项“data.table”、“assertthat”、“magrittr”、“lazyeval”、“openNLPdata”、“qdapdictories”、“qdapRegex”、“qdapTools”、“dplyr”、“gender”、“gridExtra”、“igraph”、“NLP”、“openNLP”、“reports”、“stringdist”、“tm”、“venneuler”
,答案是c正确。最后一点注意:值得注意的是,mgsub不需要像gsub需要的那样在模式部分逃逸方括号。另一方面,这意味着它不能接受正则表达式模式。我提出了一个新问题,关于如何将正则表达式传递给mgsub。@PabloMarin Garcia感谢您的评论。是的,它有很多依赖项是的。你的新问题已经得到了答案:-)看看源代码,我注意到
mgsub
是一个for循环
gsub
 tt_ori <- 'I have [%VAR1%] and [%VAR2%]'