2012-02-15 20 views
5

Ho un vettore di caratteri e voglio assicurarmi che tutti gli elementi del vettore abbiano la stessa lunghezza. Quindi mi riempio gli elementi corti con spazi, in questo modo:Sprintf in R non conta le dieresi

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

come risposte alla mia previous question suggerito. Questo va bene, ma sembra avere problemi con le dieresi. Ad esempio se il mio vettore si presenta così:

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

Sto eseguendo R su Mac OS X (10.6). Come posso risolvere questo?

MODIFICA: Nota, non sto cercando di correggere l'output di nchar perché è corretto. Il problema è che sprintf perde l'umlaut.

MODIFICA: aggiornamento R, modificato in locale DWins: nessuna modifica. Ma:

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

strano.

+0

Impossibile riprodurre su un Mac che esegue 10.5.8/Rv2.14.1 con> Sys.getlocale() = "en_US.UTF-8/it_IT.UTF-8/it_IT.UTF-8/C/it_IT.UTF- 8/en_US.UTF-8" . –

+0

È molto interessante. Avete, per caso, un manuale/collegamento come installare altre impostazioni locali? Inoltre, dovrei aggiornare R, ancora in esecuzione 2.13.2 –

+0

L'aggiornamento a 2.14.1 non ha aiutato :( –

risposta

1

C'è probabilmente un modo più pulito ... ma questo funziona:

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

(vedi commento per la [non] -explication per il 13)

+0

hmm, se lo eseguo, tutti i miei elementi sono lunghi 17 caratteri, ma voglio solo aggiungere spazi fino a 15 caratteri di lunghezza totale. Nota anche che alla fine non mi interessa la lunghezza (ho appena postato nchar che non devi contare tutti) - vuoi gli stessi elementi vettoriali. –

+0

@ ran2: vero ... bizzarro ... ovviamente funziona cambiando 15 per 13 ... ma non sono sicuro del perché. Il risultato di sapply è un vettore di elementi, non la lunghezza comunque – nico

+0

+1 per l'hack finora, perché aiuta. Comunque mi piacerebbe scoprire come risolvere davvero questo modo di sprint. –

1

Ho trovato questo nella pagina ?sprintf :

Se qualsiasi elemento di fmt o qualsiasi argomento di carattere è dichiarato come UTF-8, l'elemento del risultato sarà in UTF-8 e la codifica dichiarata come UTF-8. Altrimenti sarà nella codifica delle impostazioni locali correnti.

L'input prende il suo locale dal locale di Rgui (credo); vedi sotto.

Su Windows è fortunatamente già stampa:

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

ho penso su MacOS è possibile raggiungere questo obiettivo con R apertura come il seguente, ma io non sono qui qualsiasi Mac per testare in realtà questo:

Rgui --encoding=utf-8 
+0

Immagino che 'options (" encoding ")' possa essere di aiuto. –

+0

buona idea. Sfortunatamente uso già utf-8, in R Studio almeno tutti i miei script sono salvati su UTF-8 e il mio locale è impostato su "C/UTF-8/C/C/C/C". Ma bello sapere in Windows Sprint funziona correttamente. –

+0

@ ran2 R Studio? Hmm. Hai provato a eseguire il codice in 'Rgui --encoding = utf-8'? Se funziona in Rgui allora sai che è colpa di R Studio e sai dove cercare altre opzioni –