2011-01-13 19 views
17

Al ejecutar un R-plugin en SPSS, recibo una cadena de ruta de Windows como entrada, p.Ignorar caracteres de escape (barras diagonales inversas) en cadenas R

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

me gustaría utilizar ese camino en código R posterior, pero entonces necesitará las barras para ser reemplazado con barras diagonales, de lo contrario R interpreta como escapes (por ejemplo. "\ U usó sin dígitos hexadecimales" errores) .

Sin embargo, no he podido encontrar una función que pueda reemplazar las barras diagonales inversas con barras oblicuas o escapárselas por partida doble. Todas esas funciones suponen que esos caracteres están escapados.

Entonces, ¿hay algo en la línea de:

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

¿Puedes dar al menos un poco más de código sobre el problema? ¿De dónde viene la cuerda? ¿Cómo ingresa el código R? Si obtiene el error, eso es demasiado tarde, y ese error ocurre en lo que a mí respecta, exactamente en el punto en que la cadena entra en R. –

Respuesta

12

Usted puede tratar de utilizar el argumento de los 'allowEscapes' en la exploración()

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

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

allowEscapes = FALSE es el valor predeterminado, por lo que podría abreviarse a 'x <- scan (what = "") ' –

+2

Scan() parece ser un comando interactivo. ¿Es posible utilizarlo en un script, desencadenado por un diálogo (por lo tanto, se ejecuta en segundo plano)? – mhermans

+0

Si coloca el comando de escaneo seguido de la entrada seguido de una línea en blanco en un script 'abc.R' y luego ejecuta' Rscript abc.R' en la línea de comando del sistema operativo, funcionará pero no funcionará si use 'source (" abc.R ")' desde R. –

5

primero que necesita para lograr que se asigna a un nombre:

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

Tenga en cuenta que con el fin de conseguir que en un vector de nombre que tenía que doblar a todos, lo que da una sugerencia acerca de cómo podría usar regex:

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

Necesitaba doblar doblemente las barras diagonales inversas. El primero de cada par de es señalar a la máquina grep que lo que viene a continuación es un literal.

+1

Pero R interpreta "C: \\ Users \\ mhermans \\ somefile.csv" de la misma manera que "C: /Users/mhermans/somefile.csv" ¿verdad?El problema radica en leer una cadena con barras inversas simples y convertirla en una de esas dos soluciones. –

+0

No. No entiendes. Había solo barras invertidas en la cuerda que creé. Necesitas entender la diferencia entre representación y realidad. "\\" no es "/" . Pruebe 'nchar (" \\ ")' para seguir avanzando hacia la iluminación. –

+1

De hecho, tengo una cadena con comillas simples como entrada, no comillas dobles. En este caso, la realidad según R es "C: Usuarios hermans", representada por "C: \ Users \ mhermans". Necesito que R se dé cuenta de que "C: \ Users \ mhermans" es la realidad. – mhermans

1

Si el archivo E: \ Data \ junk.txt contiene el siguiente texto (sin comillas): C: \ Users \ mhermans \ somefile.csv

Usted puede obtener una advertencia con la siguiente afirmación, pero será trabajo:

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

Si el archivo E: \ Data \ junk.txt contiene el siguiente texto (con comillas): "C: \ Users \ mhermans \ somefile.csv"

la declaración anterior readlines podría también darle una advertencia, pero ahora contendrá:

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

Por lo tanto, para conseguir lo que desea, asegúrese de que no hay comillas en el archivo de entrada, y el uso:

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

Parece ser una posibilidad, si escribo la cadena que recibo como entrada del cuadro de diálogo en una ventana temporal archivo y vuelva a leerlo. ¿Hay alguna forma de hacerlo sin el paso de escritura/lectura? – mhermans

+0

@mhermans: 'readLines' puede tomar entrada desde cualquier conexión, no solo desde archivos. De donde sacas tu hilo? –

+0

@mhermans: como dice Richie anteriormente, puede tomar varias conexiones. De su comentario sobre un "cuadro de diálogo", puede intentar copiar la cadena al portapapeles. Luego use texinp <- suprimirAdvertencias (readLines ("portapapeles")) –

Cuestiones relacionadas