2011-01-13 12 views
17

Durante l'esecuzione di un plug-in R in SPSS, ricevo una stringa del percorso di Windows come input, ad es.Ignora caratteri di escape (barre retroverse) nelle stringhe R

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

desidero utilizzare tale percorso nel codice successivo R, ma poi le barre devono essere sostituiti con barre dirette, altrimenti R interpreta come fughe (ad es. "\ U utilizzato senza hex digits" errori) .

Tuttavia non sono riuscito a trovare una funzione in grado di sostituire i backslash con le barre di foward o di evitarli. Tutte queste funzioni presuppongono che quei personaggi siano sfuggiti.

Quindi, c'è qualcosa sulla falsariga di:

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

Puoi dare almeno un po 'di codice in più al problema? Da dove viene la stringa? Come entra nel codice R? Se si ottiene l'errore, è troppo tardi e l'errore si verifica per quanto mi riguarda esattamente nel punto in cui la stringa va in R. –

risposta

12

Si può provare a utilizzare l'argomento delle 'allowEscapes' a scansione()

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

print(X) 
[1] "C:\\Users\\mhermans\\somefile.csv" 
+2

allowEscapes = FALSE è il valore predefinito in modo che si possa abbreviare che a 'x <- scan (what = "") ' –

+2

Scan() sembra essere un comando interattivo. È possibile utilizzare in uno script, attivato da una finestra di dialogo (quindi eseguito in background)? – mhermans

+0

Se si inserisce il comando di scansione seguito dall'input seguito da una riga vuota in uno script 'abc.R' e quindi si esegue' Rscript abc.R' sulla riga di comando del sistema operativo, funzionerà ma non funzionerà se si usa 'source (" abc.R ")' dall'interno di R. –

5

Prima di tutto bisogna farlo assegnato a un nome:

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

si noti che al fine di ottenere in un nome di vettore avevi bisogno di raddoppiare tutti, che dà un suggerimento su come si potrebbe usare espressioni regolari:

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

È necessario per doppiamente doppio le barre inverse. Il primo di ogni coppia di \ 's è quello di segnalare alla macchina grep che ciò che segue è un valore letterale.

+1

Ma R interpreta "C: \\ Users \\ mhermans \\ somefile.csv" nello stesso modo di "C: /Users/mhermans/somefile.csv" giusto?Il problema sta nel leggere una stringa con singoli backslash e trasformarla in una di queste due soluzioni. –

+0

No. Non capisci. C'erano solo singole barre posteriori nella stringa che ho creato. Devi capire la differenza tra rappresentazione e realtà. "\\" non è "/" . Prova 'nchar (" \\ ")' per ulteriori progressi verso l'illuminazione. –

+1

In effetti ho una stringa con le virgolette singole come input, non le doppie virgolette. In questo caso la realtà secondo R è "C: Utenti hermans", rappresentato da "C: \ Users \ mhermans". Ho bisogno di R per realizzare "C: \ Users \ mhermans" è la realtà. – mhermans

1

Se il file E: \ Data \ rusco.txt contiene il seguente testo (senza virgolette): C: \ Users \ mhermans \ somefile.csv

Si può ottenere un avviso con la seguente dichiarazione, ma sarà lavoro:

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

Se il file E: \ Data \ rusco.txt contiene il seguente testo (con le virgolette): "C: \ Users \ mhermans \ somefile.csv"

la dichiarazione readlines sopra potrebbe anche darti un avvertimento, ma ora conterrà:

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

Quindi, per ottenere ciò che si vuole, assicurarsi che non ci sono citazioni nel file in entrata, e l'uso:

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

Questa sembra essere una possibilità, se scrivo la stringa che ricevo come input dalla finestra di dialogo ad una temporanea file e rileggerlo. Esiste un modo per farlo senza la fase di scrittura/lettura? – mhermans

+0

@mhermans: 'readLines' può ricevere input da qualsiasi connessione, non solo da file. Da dove prendi la tua stringa? –

+0

@mhermans: come dice Richie sopra, può richiedere varie connessioni. Dal tuo commento su una "finestra di dialogo", potresti provare a copiare la stringa negli Appunti. Quindi usa texinp <- suppressWarnings (readLines ("clipboard")) –

Problemi correlati