В предыдущем вопросе (заменить строка в R, дающая вектор шаблонов и вектор замен) y обнаружил, что mgsub имеет в качестве шаблона строку, которую не нужно экранировать. Это хорошо, когда вы хотите заменить текст, например '[%.+%]', литеральной строкой, но плохо, если вам нужно передать реальное регулярное выражение, например:
library('stringr')
library('qdap')
tt_ori <- 'I have VAR1 and VAR2'
ttl <- list(ttregex='VAR([12])', val="val-\\1")
ttl
# OK
stringr::str_replace_all( tt_ori, perl( ttl$ttregex), ttl$val)
# [1] "I have val-1 and val-2"
# OK
mapply(gsub, ttl$ttregex, ttl$val, tt_ori, perl=T)
# [1] "I have val-1 and val-2"
# FAIL
qdap::mgsub(ttl$ttregex, ttl$val, tt_ori)
# [1] "I have VAR1 and VAR2"
Как я могу передать регулярное выражение в mgsub?
[ОБНОВЛЕНИЕ] @BondeDust прав, с этим упрощенным примером вопрос не имеет смысла. Причина желания использовать mgsub заключается в его способности использовать вектор шаблонов и вектор замен с одной строкой и выполнять все замены в этой строке.
Например, в следующем примере
> tt_ori <- 'I have VAR1 and VAR2 at CARTESIAN'
> ttl <- list( ttregex=c('VAR([12])', 'CARTESIAN')
+ , valregex=c("val-\\1", "XY")
+ , tt=c('VAR1', 'VAR2', 'CARTESIAN')
+ , val=c('val-1', 'val-2', 'XY')
+ )
> ttl
$ttregex
[1] "VAR([12])" "CARTESIAN"
$valregex
[1] "val-\\1" "XY"
$tt
[1] "VAR1" "VAR2" "CARTESIAN"
$val
[1] "val-1" "val-2" "XY"
# str_replace and gsub return multiple strings with partial substitutions
> stringr::str_replace_all( tt_ori, perl( ttl$ttregex), ttl$valregex)
[1] "I have val-1 and val-2 at CARTESIAN" "I have VAR1 and VAR2 at XY"
> mapply(gsub, ttl$ttregex, ttl$valregex, tt_ori, perl=T)
VAR([12]) CARTESIAN
"I have val-1 and val-2 at CARTESIAN" "I have VAR1 and VAR2 at XY"
# qdap (passing regexes) FAIL
> qdap::mgsub(ttl$ttregex, ttl$valregex, tt_ori)
[1] "I have VAR1 and VAR2 at XY"
# qdap (passing strings) is OK
> qdap::mgsub(ttl$tt, ttl$val, tt_ori)
[1] "I have val-1 and val-2 at XY"
Я хочу использовать регулярные выражения, когда это возможно, и не писать все возможные строки (иногда я не знаю их заранее).
mgsub
был разработан, чтобы принимать два совпадающих шаблона и вектора замены. То, что вы запрашиваете, уже было предоставлено обычнымgsub
:gsub(ttl[[1]], ttl[[2]], tt_ori) # [1] "I have val-1 and val-2"
- person IRTFM   schedule 16.02.2015fixed = TRUE
наfixed = FALSE
. - person Tyler Rinker   schedule 16.02.2015> qdap::mgsub(ttl$ttregex, ttl$valregex, tt_ori,fixed = F) [1] "I have val-1 and val-2 at XY"
, пожалуйста, поместите этот комментарий в качестве ответа, и я приму его. - person Pablo Marin-Garcia   schedule 16.02.2015