通过评估反向引用替换 gsub 中的文本

Replacing text in gsub by evaluating a backreference

假设我有一些文本:

myF <- "lag.variable.1+1"

对于所有类似的表达式,我想得到以下结果:lag.variable.2(即用实际总和替换 1+1

以下似乎不起作用,反向引用似乎没有在 eval(parse() bit ) 中执行:

myF<-gsub("(\.\w+)\.([0-9]+\+[0-9]+)", 
            paste0( "\1." ,eval(parse(text ="\2"))) ,
            myF )

关于如何达到预期结果的任何提示? 谢谢!

我们可以使用gsubfn

library(gsubfn)
gsubfn("(\d+\+\d+)", ~ eval(parse(text = x)), myF)
#[1] "lag.variable.2"

 gsubfn("\.([0-9]+\+[0-9]+)", ~ paste0(".", eval(parse(text = x))), myF2)
#[1] "lag.variable0.3 * lag.variable1.2 + 9892"

str_replace

library(stringr)
str_replace(myF, "(\d+\+\d+)", function(x) eval(parse(text = x)))
#[1] "lag.variable.2"

或者 strsplitpaste

的选项
v1 <- strsplit(myF, "\.(?=\d)", perl = TRUE)[[1]]
paste(v1[1], eval(parse(text = v1[2])), sep=".")
#[1] "lag.variable.2"

数据

myF <- "lag.variable.1+1"
myF2 <- "lag.variable0.3 * lag.variable1.1+1 + 9892"

以下是如何将您当前的模式gsubfn一起使用:

library(gsubfn)
x <- " lag.variable0.3 * lag.variable1.1+1 + 9892"
p <- "(\.\w+)\.([0-9]+\+[0-9]+)"
gsubfn(p, function(n,m) paste0(n, ".", eval(parse(text = m))), x)
# => [1] " lag.variable0.3 * lag.variable1.2 + 9892"

请注意,在这种情况下,匹配项将传递给可调用对象,其中第 1 组分配给 n 变量,第 2 组分配给 m。 return 是第 1 组、.evaled 第 2 组内容的串联。

请注意,您可以使用 PCRE 正则表达式(添加 perl=TRUE 参数)简化可调用部分 \K,匹配重置运算符,丢弃目前匹配的所有文本:

p <- "\.\w+\.\K(\d+\+\d+)"
gsubfn(p, ~ eval(parse(text = z)), x, perl=TRUE)
[1] " lag.variable0.3 * lag.variable1.2 + 9892"

您可以通过将 \+ 替换为 [-+/*] 来进一步增强模式以支持其他操作数,如果您需要支持带小数部分的数字,请将 [0-9]+ 替换为 \d*\.?\d+:

p <- "(\.\w+)\.(\d*\.?\d+[-+/*]\d*\.?\d+)"
## or a PCRE regex:
p <- "\.\w+\.\K(\d*\.?\d+[-+/*]\d*\.?\d+)"