将函数应用于R中gsub中的反向引用

JMD*_*JMD 3 backreference r

我是R的新手,我坚持使用似乎不起作用的反向引用.在:

gsub("\\((\\d+)\\)", f("\\1"), string)
Run Code Online (Sandbox Code Playgroud)

它正确地抓取括号之间的数字,但不应用(正确定义的,否则正常)函数f来替换数字 - >它实际上是传递给f的字符串"\ 1".

我错过了什么或只是R不处理这个?如果是这样,任何想法我怎么能做类似的事情,即将"动态"的函数应用于我正在解析的文本中的括号之间出现的(实际上很多)数字?

非常感谢你的帮助.

MrF*_*ick 6

R没有选择将功能直接应用于匹配通道gsub.您实际上必须提取匹配,转换值,然后替换值.这个功能相对容易regmatches.例如

x<-"(990283)M (31)O (29)M (6360)M"

f<-function(x) {
    v<-as.numeric(substr(x,2,nchar(x)-1))
    paste0(v+5,".1")
}

m <- gregexpr("\\(\\d+\\)", x)
regmatches(x, m) <- lapply(regmatches(x, m), f)
x
# [1] "990288.1M 36.1O 34.1M 6365.1M"
Run Code Online (Sandbox Code Playgroud)

当然,你可以f做任何你喜欢的事情,只要确保它对矢量友好.当然,你可以将它包装在你自己的函数中

gsubf <- function(pattern, x, f) {
    m <- gregexpr(pattern, x)
    regmatches(x, m) <- lapply(regmatches(x, m), f)
    x   
}
gsubf("\\(\\d+\\)", x, f)
Run Code Online (Sandbox Code Playgroud)

请注意,在这些示例中,我们没有使用捕获组,我们只是抓住整个匹配.有一些方法可以提取捕获组,但它们有点混乱.如果你想提供一个需要这种提取的例子,我或许可以想出更好的东西.