2012-02-15 12 views
5

Tengo un vector de caracteres y quiero asegurarme de que todos los elementos del vector tengan la misma longitud. Por lo tanto yo lleno elementos cortos con espacios, así:Sprintf en R no cuenta umlauts

vec <- c("fjdlksa01dada","rau","sjklf") 
x <- sprintf("%-15s", vec) 
nchar(x) 
# returns 
[1] 15 15 15 

como respuestas a mi previous question sugeridos. Esto está bien, pero parece tener problemas con diéresis. Por ejemplo, si mi vector se ve así:

vec2 <- c("fjdlksa01dada","rauü","sjklf") 
y <- sprintf("%-15s", vec) 
nchar(y) 
# returns 
[1] 15 14 15 

Estoy ejecutando R en Mac OS X (10.6). ¿Cómo puedo arreglar esto?

EDITAR: Nota, no estoy buscando arreglar la salida de nchar porque es correcta. El problema es que sprintf pierde la diéresis.

EDITAR: Actualiza R, cambia a DWins configuración regional - sin cambios en absoluto. Pero:

vec2 <- c("fjdlksa01dada","rauü","sjklf") 
Encoding(vec2) 
# returns 
[1] "unknown" "UTF-8" "unknown" 

extraño.

+0

No se puede reproducir en una Mac con 10.5.8/Rv2.14.1 con> Sys.getlocale() = "en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF- 8/en_US.UTF-8 ". –

+0

Eso es muy interesante. ¿Tiene -por casualidad- un manual/enlace sobre cómo instalar otras configuraciones regionales? Además, debo actualizar R, todavía ejecutando 2.13.2 –

+0

La actualización a 2.14.1 no ayudó :( –

Respuesta

1

es probable que haya una forma más limpia ... pero esto funciona:

sapply(vec, function(x){ 
     paste(x, paste(rep(" ", 13-nchar(x)), collapse=""), "") 
     }) 

(Véase el comentario a continuación para el -explication [no] para el 13)

+0

hmm, si ejecuto esto, todos mis elementos tienen 17 caracteres, pero solo quiero añadir espacios de hasta 15 caracteres de longitud total. Tenga en cuenta también, que al final no estoy interesado en la longitud (acaba de publicar nchar que todos ustedes no tienen que contar) - quieren los elementos del vector en sí mismos. –

+0

@ ran2: cierto ... extraño ... obviamente funciona cambiando 15 por 13 ... pero no estoy seguro de por qué. El resultado de sapply es un vector de elementos, no la longitud de todos modos – nico

+0

+1 para el hack hasta el momento, porque ayuda. Aun así, me gustaría descubrir cómo arreglar esto realmente a la velocidad de sprintf. –

1

He encontrado esto en la página ?sprintf :

Si cualquier elemento de fmt o cualquier argumento de caracteres se declara como UTF-8, el elemento del resultado estará en UTF-8 y tendrá la codificación declarada como UTF-8. De lo contrario, estará en la codificación del lugar actual.

La entrada toma su configuración regional de la ubicación de Rgui (creo); vea abajo.

En las ventanas que, afortunadamente, ya se imprime:

> vec2 <- c("fjdlksa01dada","rauü","sjklf") 
> y <- sprintf("%-15s", vec) 
> nchar(y) 
[1] 15 15 15 

I piensan en MacOS se puede lograr esto con la apertura de R como la siguiente, pero no tengo ninguna Mac aquí para probar realmente esto:

Rgui --encoding=utf-8 
+0

Supongo que 'options (" encoding ")' sería de ayuda, también. –

+0

buen pensamiento. Lamentablemente ya uso utf-8, en R Studio al menos todas mis secuencias de comandos se guardan en UTF-8 y mi configuración regional se establece en "C/UTF-8/C/C/C/C". Pero es bueno saber que Windows sprintf funciona correctamente. –

+0

@ ran2 R Studio? Hmm. ¿Has intentado ejecutar el código en 'Rgui --encoding = utf-8'? Si funciona en Rgui, entonces sabrá que es culpa de R Studio y sabrá dónde buscar más opciones. –