2014-12-15 13 views
10

Vorrei utilizzare gsub per sostituire ogni occorrenza di una barra rovesciata in una stringa con 2 barre rovesciate.R - gsub che sostituisce i backslash

Attualmente, quello che ho provato è gsub("\\\\", "\\", x). Questo non sembra funzionare però. Tuttavia, se cambio l'espressione in sostituzione di ogni backslash con "a", funziona correttamente.

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

L'ultimo carattere è solo un singolo backslash; R stampa solo 2 perché stampa caratteri di escape con il backslash. L'utilizzo di nchar conferma che la lunghezza è 1.

Quali sono le cause di questa funzionalità? Il secondo argomento su gsub non è un'espressione regolare, quindi avere 4 barre rovesciate nella stringa letterale deve essere convertito in un carattere con 2 barre rovesciate. Ha ancora meno senso che la prima chiamata gsub restituisca una stringa vuota.

+1

Penso che tu abbia l'ordine dei parametri confuso. Il primo parametro è quello che stai cercando. Quindi, se vuoi sostituire ogni barra con due, non vuoi: 'gsub (" \\\\ "," \\\\\\\\ ", x)'? Inoltre, se si 'cat()' il valore piuttosto che l'uso implicito 'print()', non si vede la parte di escape della barra. – MrFlick

+0

Vedere anche [qui] (http://stackoverflow.com/questions/11806501/backslash-in-r-string) –

risposta

15

Ecco quello che vi serve:

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

La ragione per cui è necessario quattro backslash per rappresentare una barra rovesciata letterale è che "\" è un carattere di escape in entrambe le stringhe di ricerca e per il motore regex a cui si è in ultima analisi, passando i tuoi schemi. Se si stesse parlando direttamente con il motore regex, si utilizzerà "\\" per indicare una barra rovesciata letterale. Ma al fine di ottenere R per passare "\\" sul motore regex, è necessario digitare "\\\\".


(Se sono solo voglia di raddoppiare backslash, si potrebbe desiderare di utilizzare questa invece):

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

Sì, l'ho trovato per tentativi ed errori. Mi stavo chiedendo perché il comportamento di cui sopra è successo. Il secondo argomento non è un'espressione regolare, quindi il risultato dovrebbe essere solo della stessa lunghezza del secondo argomento. In questo esempio, il secondo argomento è lungo 4 caratteri ma il risultato è solo 2. –

+1

Il secondo argomento potrebbe non essere un'espressione regolare, ma la '' \ "' backslash è ancora interepreted come un carattere di escape al suo interno. Viene usato come tale nel secondo argomento di una chiamata come questa: 'gsub (" ([[: digit:]] *) \\ s * ([[: alpha:]] *) "," \\ 2-- -> \\ 1 "," 101 tromboni ")' –

+1

Sono sorpreso che non si lamenta nel mio primo esempio, in quanto vi è un carattere di escape e nient'altro nel secondo argomento. So che facendo la stessa cosa per una regex, ad es. nel primo argomento, genererà un errore sulla barra retroversa finale. –