0

前の質問 (パターンのベクトルと置換のベクトルを与える 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"

可能な場合は正規表現を使用し、可能なすべての文字列を記述したくありません (事前にわからない場合もあります)。

4

1 に答える 1

2

fixed = TRUEに変更fixed = FALSE

于 2015-02-16T00:30:58.963 に答える