【发布时间】:2015-02-15 18:52:43
【问题描述】:
给定一个我想要替换的具有不同占位符的字符串,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 包中,它会像前面所示的那样被调用,并且能够在单个字符串中进行所有替换。
是否有人对我的循环有更好的解决方案或建议,或者我应该将其转换为函数吗?
[注意] 字符串可以是小型网页模板,o 配置文件。它们很小,因此循环进行 10 或 20 次替换并不是什么大问题,但我正在寻找更优雅的解决方案。
【问题讨论】:
-
如果您的预期输出是
tt_out基于输入tt_ori,mgsub应该可以工作mgsub(c('[%VAR1%]' , '[%VAR2%]'), c('val-1', 'val-2'), tt_ori) -
@akrun 你在哪里说 qdap 中的 mgsub? inside-r.org/packages/cran/qdap/docs/multigsub。寻找它,我刚刚找到了这个链接stackoverflow.com/questions/15253954/…,其中实现了一些 mgsub 函数。如果您将评论写为答案,我会接受它
-
@akrun,您之前评论中的 @ 指向其他 Pablo ;-)