web-dev-qa-db-ja.com

R文字列のエスケープ文字(バックスラッシュ)を無視する

SPSSでRプラグインを実行しているときに、入力としてWindowsパス文字列を受け取ります。

'C:\Users\mhermans\somefile.csv'

後続のRコードでそのパスを使用したいのですが、スラッシュをスラッシュに置き換える必要があります。そうしないと、Rはそれをエスケープとして解釈します(たとえば、「\ Uは16進数なしで使用されます」エラー)。

しかし、バックスラッシュをスラッシュに置き換えたり、ダブルエスケープしたりできる関数を見つけることができませんでした。これらの関数はすべて、これらの文字がエスケープされていることを前提としています。

それで、次の線に沿って何かがありますか?

>gsub('\\', '/', 'C:\Users\mhermans')
C:/Users/mhermans
22
mhermans

Scan()で「allowEscapes」引数を使用してみてください

X=scan(what="character",allowEscapes=F)
C:\Users\mhermans\somefile.csv

print(X)
[1] "C:\\Users\\mhermans\\somefile.csv"
15
Sacha Epskamp

まず、名前に割り当てる必要があります。

pathname <- 'C:\\Users\\mhermans\\somefile.csv'

名前ベクトルに入れるには、すべてを2倍にする必要があることに注意してください。これにより、正規表現の使用方法に関するヒントが得られます。実際、テキストファイルから読み込んだ場合、Rがすべての倍増を行います。気にしないでください本当にバックスラッシュを2倍にします。単一の円記号として保存されていますが、そのように表示されているため、コンソールからそのように入力する必要があります。それ以外の場合、Rインタープリターはそれを特殊文字に変換しようとします(多くの場合失敗します)。そして、問題を悪化させるために、正規表現はバックスラッシュをエスケープとしても使用します。したがって、grep、sub、またはgsubでエスケープを検出するには、円記号を4倍にする必要があります。

 gsub("\\\\", "/", pathname)
# [1] "C:/Users/mhermans/somefile.csv"

バックスラッシュを二重に「2倍」にする必要がありました。 \の各カップルの最初は、次に来るのはリテラルであることをgrepマシンに通知することです。

考えてみましょう:

 nchar("\\A")
#  returns `[1] 2`
5
42-

ファイルE:\ Data\junk.txtに次のテキスト(引用符なし)が含まれている場合:C:\ Users\mhermans\somefile.csv

次のステートメントで警告が表示される場合がありますが、機能します。

 texinp <- readLines("E:\\Data\\junk.txt")

ファイルE:\ Data\junk.txtに次のテキスト(引用符付き)が含まれている場合: "C:\ Users\mhermans\somefile.csv"

上記のreadlinesステートメントでも警告が表示される場合がありますが、次のようになります。

"\" C:\ Users\mhermans\somefile.csv\""

したがって、必要なものを取得するには、受信ファイルに引用符がないことを確認し、次を使用します。

 texinp <- suppressWarnings(readLines("E:\\Data\\junk.txt"))
1
bill_080