在其中有一个带有(单个)数字的字符串。我想将数字增加一个。简单吧?我写了下面的内容而没有再想一想:
sub("([[:digit:]]+)", as.character(as.numeric("\\1")+1), string)
......并获得了NA。
> sub("([[:digit:]]+)", as.character(as.numeric("\\1")+1), "x is 5")
[1] NA
Warning message:
In sub("([[:digit:]]+)", as.character(as.numeric("\\1") + 1), "x is 5") :
NAs introduced by coercion
为什么不起作用?我知道其他方法,所以我不需要“解决方案”。我想了解为什么这种方法失败了。
答案 0 :(得分:3)
关键是反向引用仅在匹配操作期间进行评估,并且在此之前无法将其传递给任何函数。
当您编写as.numeric("\\1")
时,as.numeric
函数接受\1
字符串(反斜杠和1
字符)。因此,结果是预期的,NA
。
这是因为R中没有内置的反向引用插值。
您可以使用gsubfn
套餐:
> library(gsubfn)
> s <- "x is 5"
> gsubfn("\\d+", function(x) as.numeric(x) + 1, s)
[1] "x is 6"
答案 1 :(得分:2)
它不起作用,因为sub
的参数在传递给正则表达式引擎(由.Internal
调用之前)进行评估。
特别是,as.numeric("\\1")
评估为NA
...之后你就注定了。