2016-10-31 2 views
1

F: Wie kann ich Unterstriche "_" durch Backslash-Unterstriche "_" in einer R-Zeichenfolge ersetzen? Ich würde lieber das stringr Paket verwenden.Ersetzen von Unterstrich "_" durch Backslash-Unterstrich " _" in einer R-Zeichenfolge

Kann auch jeder erklären, warum Zeile 5 unten nicht zum gewünschten Ergebnis führt? Ich war mir fast sicher, dass das funktionieren würde.

library(stringr) 
s <- "foo_bar_baz" 
str_replace_all(s, "_", 5) # [1] "foo5bar5baz" 
str_replace_all(s, "_", "\_") # Error: '\_' is an unrecognized escape in character string starting ""\_" 
str_replace_all(s, "_", "\\_") # [1] "foo_bar_baz" 
str_replace_all(s, "_", "\\\_") # Error: '\_' is an unrecognized escape in character string starting ""\\\_" 
str_replace_all(s, "_", "\\\\_") # [1] "foo\\_bar\\_baz" 

Kontext: Ich mache eine LaTeX-Tabelle mit xtable und muss meine Spaltennamen sanieren, da sie alle Unterstrichen haben und LaTeX brechen.

+1

'str_replace_all (s," _ "," \\\\ _ ") # [1]" foo \\ _ bar \\ _ baz "' ist genau das, was Sie wollen, da '\\' einen literalen Backslash darstellen. (Sie müssen den Unterschied zwischen einer Zeichenfolge und der Art, wie sie dargestellt wird, verstehen). –

+0

Sie haben Recht. Es funktioniert. Immer noch verwirrend für mich. Aber es funktioniert. Thx für den Zeiger. – lowndrul

+0

In diesem Fall, upvote mein Kommentar, ich mag Leute, die meine Kommentare upvote, aber ich mag Bären, Dachse, Hasen, Ponys und Einhörner auch. Vögel sind meine Freunde .... wie Delfine. –

Antwort

1

Es ist alles viel einfacher. Ersetzen Sie Literal Strings mit Literal Strings mit Hilfe von fixed("_"), keine Notwendigkeit für eine Regex.

> library(stringr) 
> s <- "foo_bar_baz" 
> str_replace_all(s, fixed("_"), "\\_") 
[1] "foo\\_bar\\_baz" 

Und wenn Sie cat verwenden:

> cat(str_replace_all(s, fixed("_"), "\\_")) 
foo\_bar\_baz> 

Sie werden sehen, dass Sie tatsächlich ein Backslash im Ergebnis haben.

+0

Cool, wusste nicht darüber. Nicht intuitiv für mich, warum "fixed" auf das Muster und nicht auf den Ersatz angewendet würde. Aber es funktioniert :) – lowndrul

+1

Warum verwenden Sie dann 'stringr', benutzen' gsub' - 'gsub (" _ "," \\ _ ", s, fixed = TRUE)'. Es ist intuitiver :) –

Verwandte Themen