2016-08-15 57 views
2

有一个字符串中包含(单个)数字。我想把数字加1。很简单,对吧?我写了以下内容,但没有再给它一个想法:使用子增加一个字符串中的数字

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

如果没有gsub函数的回调能力,就无法工作。另一种方法是使用全局_search_在循环中重写字符串。 – sln

+0

基本上,gsub的_substitute_字符串部分被用作带有backref'd正则表达式变量的模板,由_internal_回调(通常不可用)格式化。所以,你不能真正在函数的这个部分运行代码,即使是邪恶的eval(它不知道匹配)。 – sln

回答

3

重点在于反向引用仅在匹配操作期间进行评估,并且在此之前您无法将其传递给任何函数。

当您编写as.numeric("\\1")时,as.numeric函数接受一个\1字符串(一个反斜杠和一个1 char)。因此,预计结果为NA

出现这种情况,因为在R.

没有内置反向引用插你可以使用一个gsubfn包:

> library(gsubfn) 
> s <- "x is 5" 
> gsubfn("\\d+", function(x) as.numeric(x) + 1, s) 
[1] "x is 6" 
+1

啊,当然 - as.numeric首先被评估。感谢您的洞察力。 (并感谢AEF和Laurel的答案!) –

2

它不起作用,因为sub的参数在传递给正则表达式引擎(由.Internal调用)之前被评估。

特别是,as.numeric("\\1")评估为NA ...之后,你注定了。

2

可能更容易以不同的方式把它。你得到,如果你使用,你会得到同样的错误:

print(as.numeric("\\1")+1) 

记住,字符串被传递给函数,他们是由正则表达式引擎解释。字符串\\1从未转换为5,因为此计算是在函数内完成的。

请注意,\\1不是作为一个数字。 NA似乎是类似于零其他语言:

NA ...是操作的产品,当您尝试访问的东西,是不是有

从mpiktas的回答here

+0

R也有'NaN'。 'NA'和'NaN'类似但不相同。 –

+0

@BenBolker感谢您的信息!我不太了解R,但我愿意学习。在某些语言中,NA似乎更类似于null。 – Laurel

+0

https://cran.r-project.org/doc/manuals/r-release/R-intro。HTML#缺少值 –

相关问题