2011-03-03 13 views
8

Actualmente estoy escribiendo un pequeño paquete que se supone que se ajusta a los modelos de árbol de procesamiento multinomial (para no es necesario información de fondo a web page y pdf).¿Hay alguna forma de evitar el límite de 500 caracteres cuando se fuerzan expresiones a caracteres que usan as.character?

Lo que hace es lo siguiente: Lee un modelo (es decir, fórmulas) de un archivo y las convierte (a través de parse) en expresiones. Más adelante, algunas variables de estas expresiones se intercambian por otras variables de otro archivo (es decir, se aplican restricciones de modelo). Por lo tanto, el modelo se vuelve a transformar en caracteres (a través de as.character) y el intercambio se realiza a través de gsub.
El problema: si una sola expresión tiene más de 500 caracteres, su transformación a través de as.character los trunca a 500 caracteres (más o menos).
?as.character da:

as.character trunca componentes de objetos de lenguaje a 500 caracteres (era alrededor del 70 antes 1.3.1).

Aquí un ejemplo:

text1 <- paste(rep(LETTERS, 10), collapse = " + ") 
nchar(text1) 
[1] 1037 

expr1 <- parse(text = text1) 
text2 <- as.character(expr1) 
[1] 504 

La pregunta: ¿Puede superar esta limitación de 500 caracteres?

Sé que podríamos evitar este problema si aplicamos las restricciones (es decir, intercambiamos las variables) antes de analizar el modelo la primera vez. Pero esto implicaría mucha programación, ya que todo está básicamente listo, y sería genial si pudiéramos superar estas limitaciones de 500 caracteres de otra manera.

+1

Puede alguien dar una buena razón por la cual existiría un límite de este tipo en un programa moderno? –

+0

@David Esto, es lo que pensé, también.Especialmente, ¿por qué está codificado, y no, por ejemplo, modificable en las opciones? – Henrik

+0

Eso huele a que hay una matriz de tamaño estático, 'char s [500]' que parece coja. Tal vez hay una buena razón ... –

Respuesta

7

Puede, por hacer las cosas feas con deparse y gsub:

expr1 <- parse(text = text1) 
attributes(expr1) <- NULL 
(text3 <- paste(deparse(expr1), collapse="")) 
#rm whitespace etc 
(text3 <- gsub("\\)$", "", gsub("^expression\\(", "", 
     gsub("[[:space:]][[:space:]]+", " ", text3)))) 
nchar(text3) 

Más al punto de su aplicación, puede utilizar deparse a hacer que las cadenas de fórmulas, y utilizar esta función:

safeDeparse <- function(expr){ 
    ret <- paste(deparse(expr), collapse="") 
    #rm whitespace 
    gsub("[[:space:]][[:space:]]+", " ", ret) 
} 

de moverse por el límite de longitud estúpida que hace deparse añadir saltos de línea y dividir una sola expresión en muchas cadenas, comparar:

(f <- formula(paste("X ~", paste(rep(letters, 10), collapse=" + ")))) 
deparse(f) 
safeDeparse(f) 
+0

Eso suena interesante. Intenté jugar con 'deparse' también. Pero obtuve un 'desbordamiento de la base de datos en la línea 2'. Pero voy a probar tu versión de inmediato. – Henrik

+0

El código de fabians funciona en mi máquina (R 2.10 en Linux). –

+0

Este código también funciona en mi máquina. Pero hay un problema en mi programa ** real ** que todavía produce este error. Pero, estoy en mi camino de encontrarlo ... – Henrik

0

Actualización:

partir de la versión 2.15.0 Base de la as.character ahora tiene este comportamiento

as.character rompe líneas en objetos de lenguaje en 500 caracteres, e inserta saltos de línea.

para obtener la versión paquete de uso:

packageVersion("base") 

Saludos

Cuestiones relacionadas