2014-12-15 6 views
10

Ich möchte gsub verwenden, um jedes Auftreten eines umgekehrten Schrägstrichs in einer Zeichenfolge durch 2 umgekehrte Schrägstriche zu ersetzen.R - gsub ersetzt Backslashes

Derzeit, was ich habe versucht, ist gsub("\\\\", "\\", x). Dies scheint jedoch nicht zu funktionieren. Wenn ich jedoch den Ausdruck so ändere, dass jeder umgekehrte Schrägstrich durch "a" ersetzt wird, funktioniert das problemlos.

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

Das letzte Zeichen ist nur ein einzelner Backslash; R druckt nur 2, weil er mit dem umgekehrten Schrägstrich Zeichen mit Auslassung druckt. Mit nchar wird bestätigt, dass die Länge 1 ist.

Was verursacht diese Funktionalität? Das zweite Argument zu gsub ist kein regulärer Ausdruck. Daher sollten im Zeichenfolgenliteral vier umgekehrte Schrägstriche in ein Zeichen mit zwei umgekehrten Schrägstrichen konvertiert werden. Es macht noch weniger Sinn, dass der erste obige Aufruf eine leere Zeichenfolge zurückgibt.

+1

Ich glaube, Sie haben Ihre Parametrierauftrag verwirrt. Der erste Parameter ist, was Sie suchen. Also, wenn Sie jeden Schrägstrich durch zwei ersetzen möchten, wollen Sie nicht: 'gsub (" \\\\ "," \\\\\\\ ", x)'? Wenn Sie den Wert "cat()" anstelle des standardmäßigen impliziten "print()" verwenden, wird der ausgeblendete Teil des Schrägstrichs nicht angezeigt. – MrFlick

+0

Siehe auch [hier] (http://stackoverflow.com/questions/11806501/backslash-in-r-string) –

Antwort

15

Hier ist, was Sie brauchen:

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

Der Grund, dass Sie vier Schrägstriche müssen eine wörtliche Backslash darzustellen ist, dass "\" eine in beiden R Saiten Escape-Zeichen ist und für die Regex-Engine, auf die Sie schließlich sind Passiere deine Muster. Wenn Sie direkt mit der Regex-Engine sprechen, verwenden Sie "\\", um einen umgekehrten Schrägstrich anzugeben. Aber damit R "\\" an die Regex-Engine übergibt, müssen Sie "\\\\" eingeben.


(Wenn Sie nur wollen, Schrägstriche verdoppeln, möchten Sie vielleicht diese stattdessen verwenden):

gsub("\\", "\\\\", "\\", fixed=TRUE) 
[1] "\\\\" 
+0

Ja, ich habe das durch Versuch und Irrtum gefunden. Ich habe mich gefragt, warum das obige Verhalten passiert ist. Das zweite Argument ist keine Regex, daher sollte das Ergebnis nur die gleiche Länge wie das zweite Argument haben. In diesem Beispiel ist das zweite Argument 4 Zeichen lang, aber das Ergebnis ist nur 2. –

+1

Das zweite Argument darf keine Regex sein, aber der umgekehrte Schrägstrich wird immer noch als Escape-Zeichen in ihm dargestellt. Es wird als solches im zweiten Argument eines Anrufs wie folgt verwendet: 'gsub (" ([[: digit:]]] *) \\ s * ([[: alpha:]] *) "," \\ 2-- -> \\ 1 "," 101 Posaunen ")' –

+1

Ich bin überrascht, dass es sich in meinem ersten Beispiel nicht beschweren wird, da es einen Escape-Charakter und nichts anderes im zweiten Argument gibt. Ich weiß, dass das Gleiche für eine Regex, z.B. Im ersten Argument wird ein Fehler über den nachfolgenden Backslash ausgegeben. –