2016-08-15 12 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_文字列部分は、_reternal_コールバック(通常は利用できません)によってフォーマットされるように、バックリファレンスの正規表現変数を持つテンプレートとして使用されています。だから、関数のこの部分の中でコードを実際に実行することはできません。 – sln

答えて

3

ポイントは、後方参照がマッチ操作中にのみ評価され、その前にどの関数にも渡すことができないという点です。

as.numeric("\\1")と書くと、as.numeric関数は\1文字列(バックスラッシュと1 char)を受け入れます。したがって、結果は期待される、NA

あなたはgsubfnパッケージを使用することができR.

には組み込みの後方参照補間がないため、この問題が発生:

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

ああ、もちろん - as.numericが最初に評価されます。洞察に感謝します。 (そしてAEFとローレルのおかげで彼らの答えもありがとう!) –

2

subの引数は、正規表現エンジン(.Internalによって呼び出される)に渡される前に評価されるため、動作しません。

特に、as.numeric("\\1")は、NA ...と評価されます。

2

違ったと思うしやすいかもしれません。あなたが使用している場合、あなたが取得するのと同じエラーになっています

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

は覚えているが、文字列は、それらが正規表現エンジンによって解釈されている関数に渡されます。文字列\\1は、この計算が関数内で行われるため、5に変換されることはありません。

\\1は数字として機能しないことに注意してください。 NAは、他の言語ではnullに似ているようだ:あなたはmpiktas'答えhereそこから

ではない何かにアクセスしようとすると

NA ...操作の産物です。

+0

Rには 'NaN'もあります。 「NA」と「NaN」は類似しているが同一ではない。 –

+0

@BenBolker情報をありがとう!私は多くのRを知らないが、私は喜んで学ぶ。 NAはいくつかの言語ではnullと似ているようです。 – Laurel

+0

https://cran.r-project.org/doc/manuals/r-release/R-introhtml#欠損値 –

関連する問題