2016-08-15 85 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#缺少值 –

相關問題