web-dev-qa-db-ja.com

R-バックスラッシュを置き換えるgsub

gsubを使用して、文字列内のすべてのバックスラッシュを2つのバックスラッシュに置き換えます。

現在、私が試したのはgsub("\\\\", "\\", x)です。これはうまくいかないようです。ただし、式を変更して各バックスラッシュを「a」に置き換えると、正常に機能します。

> gsub("\\\\", "\\", "\\")
[1] ""
> gsub("\\\\", "a", "\\")
[1] "a"
> gsub("\\\\", "\\\\", "\\")
[1] "\\"

最後の文字は単一のバックスラッシュです。 Rは、バックスラッシュ付きのエスケープ文字を出力するため、2を出力します。 ncharを使用すると、長さが1であることを確認できます。

この機能の原因は何ですか? gsubの2番目の引数は正規表現ではないため、文字列リテラルに4つの円記号がある場合は、2つの円記号を持つ文字に変換する必要があります。上記の最初のgsub呼び出しが空の文字列を返すことはあまり意味がありません。

17
Jon Claus

必要なものは次のとおりです。

gsub("\\\\", "\\\\\\\\", "\\")
[1] "\\\\"

1つのリテラルバックスラッシュを表すために4つのバックスラッシュが必要な理由は、"\"がR文字列と、最終的にパターンを渡す正規表現エンジンの両方のエスケープ文字だからです。正規表現エンジンと直接話している場合は、"\\"を使用してリテラルバックスラッシュを示します。ただし、Rに"\\"を正規表現エンジンに渡すには、"\\\\"と入力する必要があります。


(バックスラッシュを2倍にしたい場合は、代わりにこれを使用することもできます):

gsub("\\", "\\\\", "\\", fixed=TRUE)
[1] "\\\\"
33
Josh O'Brien