2011-09-29 4 views
9

Nel processo di (principalmente) risposta alla domanda this, mi sono imbattuto in qualcosa che ritengo di dover già vedere prima. Diciamo che hai un elenco:Perché questo comportamento durante la forzatura di un elenco di caratteri tramite as.character()?

l <- list(a = 1:3, b = letters[1:3], c = runif(3)) 

Il tentativo di costringere l a vari tipi restituisce un errore:

> as.numeric(l) 
Error: (list) object cannot be coerced to type 'double' 
> as.logical(l) 
Error: (list) object cannot be coerced to type 'logical' 

Comunque, sto apparentemente permesso di costringere un elenco a carattere, ho solo non mi aspettavo questo risultato:

> as.character(l) 
[1] "1:3"               
[2] "c(\"a\", \"b\", \"c\")"          
[3] "c(0.874045701464638, 0.0843329173512757, 0.809434881201014)" 

Anzi, se mi è permesso di costringere gli elenchi a carattere, avrei pensato che avrei visto un comportamento più simile a questo:

> as.character(unlist(l)) 
[1] "1"     "2"     "3"     "a"     "b"     
[6] "c"     "0.874045701464638" "0.0843329173512757" "0.809434881201014" 

Nota che come ho specificato gli elementi della lista in origine influisce sull'uscita as.character:

l <- list(a = c(1,2,3), b = letters[1:3], c = runif(3)) 
> as.character(l) 
[1] "c(1, 2, 3)"             
[2] "c(\"a\", \"b\", \"c\")"          
[3] "c(0.344991483259946, 0.0492411875165999, 0.625746068544686)" 

Ho due domande:

  1. Come si as.character rivangare le informazioni dal mio creazione originale della lista l per sputare 1:3 versus c(1,2,3).
  2. In quali circostanze, vorrei farlo esattamente? Quando dovrei chiamare as.character() in un elenco e ottenere l'output di questo modulo?

risposta

7

Per gli elenchi non banali, as.character utilizza deparse per generare le stringhe.

  1. Solo se il vettore è intero e 1,2,3, ..., n - allora deparses come 1:n.

    c(1,2,3) è doppio mentre 1:3 è intero ...

  2. Nessuna idea :-)

... ma guarda deparse se si vuole capire as.character qui:

deparse(c(1L, 2L, 3L)) # 1:3 
deparse(c(3L, 2L, 1L)) # c(3L, 2L, 1L) 
deparse(c(1, 2, 3)) # c(1, 2, 3) 
+1

Aha,' deparse' sembra spiegare gran parte della mia prima domanda: – joran

6

Il file di aiuto dice

For lists it deparses the elements individually, except that it extracts the first element of length-one character vectors.

L'avevo già visto prima nel tentativo di rispondere a una domanda [non in linea] su grep. Considerare:

> x <- list(letters[1:10],letters[10:19]) 
> grep("c",x) 
[1] 1 2 

grep utilizza as.character su x, con il risultato che, dal momento che entrambi hanno c( in loro, entrambi componenti partita. Ci è voluto un po 'per capire.

"Perché lo fa? ", suppongo che uno dei membri di R core volesse farlo 1.

+1

Questo è uno dei motivi per cui R, ottimo come è per la programmazione statistica, non sarà mai al di fuori della ristretta comunità di coloro che lavorano esclusivamente con esso o sono disposti a dedicare una quantità eccessiva di energia per affrontare il suo comportamento imprevedibile. –

Problemi correlati