我是 R 的新手,并且坚持使用似乎不起作用的反向引用。在:
gsub("\\((\\d+)\\)", f("\\1"), string)
它正确地获取括号之间的数字,但没有应用(正确定义,否则工作)函数 f 来替换数字 --> 它实际上是传递给 f 的字符串“\1”。
我错过了什么还是只是 R 不处理这个?如果是这样,知道如何做类似的事情,即将函数“即时”应用于我正在解析的文本中括号之间的(实际上是许多)数字?
非常感谢你的帮助。
最佳答案
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"
当然你可以做
f
做任何你喜欢的事情,只要确保它是矢量友好的。当然,您可以将其包装在您自己的函数中gsubf <- function(pattern, x, f) {
m <- gregexpr(pattern, x)
regmatches(x, m) <- lapply(regmatches(x, m), f)
x
}
gsubf("\\(\\d+\\)", x, f)
请注意,在这些示例中,我们没有使用捕获组,我们只是抓取整个匹配项。有一些方法可以提取捕获组,但它们有点麻烦。如果您想提供一个需要进行此类提取的示例,我可能会想出一些更好的方法。
关于r - 将函数应用于 R 中 gsub 中的反向引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25506540/