R qdap::mgsub, как передать шаблон с помощью регулярного выражения?

В предыдущем вопросе (заменить строка в 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"

Я хочу использовать регулярные выражения, когда это возможно, и не писать все возможные строки (иногда я не знаю их заранее).


person Pablo Marin-Garcia    schedule 15.02.2015    source источник
comment
Это не имеет особого смысла. mgsub был разработан, чтобы принимать два совпадающих шаблона и вектора замены. То, что вы запрашиваете, уже было предоставлено обычным gsub: gsub(ttl[[1]], ttl[[2]], tt_ori) # [1] "I have val-1 and val-2"   -  person IRTFM    schedule 16.02.2015
comment
Я подозреваю, что они хотят изменить fixed = TRUE на fixed = FALSE.   -  person Tyler Rinker    schedule 16.02.2015
comment
@BondedDust Я обновил вопрос (был слишком упрощен). Вы правы, что для моего исходного примера нет смысла использовать qdap   -  person Pablo Marin-Garcia    schedule 16.02.2015
comment
Спасибо @TylerRinker, я пропустил эту часть. Он работает нормально с > 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


Ответы (1)


Изменить fixed = TRUE на fixed = FALSE

person Tyler Rinker    schedule 16.02.2015