2011-09-09 9 views
5

Esta pregunta se relaciona con mi question about Roxygen.cadenas de embalaje, pero no las subseries entre comillas, utilizando R

Quiero escribir una nueva función que hace el ajuste de texto de cuerdas, similar a strwrap o stringr::str_wrap, pero con la siguiente giro : Cualquier elemento (subcadena) en la cadena entre comillas no se debe permitir.

Así, por ejemplo, usando los siguientes datos de la muestra

test <- "function(x=123456789, y=\"This is a long string argument\")" 
cat(test) 
function(x=123456789, y="This is a long string argument") 

strwrap(test, width=40) 
[1] "function(x=123456789, y=\"This is a long" 
[2] "string argument\")"  

Quiero la salida deseada de un newWrapFunction(x, width=40, ...) sea:

desired <- c("function(x=123456789, ", "y=\"This is a long string argument\")") 
desired 
[1] "function(x=123456789, "    
[2] "y=\"This is a long string argument\")" 

identical(desired, newWrapFunction(tsring, width=40)) 
[1] TRUE 

¿Se puede pensar en una manera de hacer esto?


PS. Si puede ayudarme a resolver esto, propondré este código como un parche al roxygen2. Identifiqué dónde debería aplicarse este parche y reconoceré su contribución.

Respuesta

2

Esto es lo que hice para obtener strwrap para que no rompa las secciones citadas en espacios: A) Preprocesar las secciones "pares" después de dividir por las comillas simples sustituyendo "~ | ~" por los espacios : Definir nueva función strwrapqt

.... 
zz <- strsplit(x, "\'") # will be only working on even numbered sections 
    for (i in seq_along(zz)){ 
     for (evens in seq(2, length(zz[[i]]), by=2)) { 
      zz[[i]][evens] <- gsub("[ ]", "~|~", zz[[i]][evens])} 
         } 
zz <- unlist(zz) 
    .... insert just before 
z <- lapply(strsplit) ........... 

Luego, al final reemplazar a todos los "~ | ~" con espacios. Puede ser necesario pensar mucho más sobre los otros tipos de "eventos" de espacio en blanco para obtener un tratamiento completamente regular.

.... 
y <- gsub("~\\|~", " ", y) 
.... 

Editar: Probado @ la sugerencia de joran. Hacer coincidir las comillas simples y las dobles sería una tarea difícil con los métodos que estoy usando, pero si uno estuviera dispuesto a considerar cualquier cita tan válida como un objetivo separador, simplemente podría usar zz <- strsplit(x, "\'|\"") como criterio de división en el código anterior.

+0

Neat. @Andrie no especificó comillas simples versus dobles, pero ¿podría ser una buena idea dividir en "\" | ""? No tenía idea de cómo manejaría las comillas simples (por ejemplo, apóstrofes) dentro de los segmentos con comillas dobles. – joran

+0

@joran : Veamos si mi regex-fu está a la altura del desafío. Ciertamente, estoy dejando el tema de la cita mixta (¿desastre?) Para otro día. –

Cuestiones relacionadas