list implementato Perché questo comportamento durante la forzatura di un elenco di caratteri tramite as.character()?




attributo coercion (2)

Il file della guida dice

Per gli elenchi depone gli elementi singolarmente, tranne per il fatto che estrae il primo elemento di lunghezza, un vettore di caratteri.

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

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

grep usa as.character su x , con il risultato che, poiché entrambi hanno c( in essi, entrambi i componenti corrispondono. Ci è voluto un po 'per capire.

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

Nel processo di (principalmente) risposta a questa domanda, mi sono imbattuto in qualcosa che ritengo di dover già vedere prima. Diciamo che hai una lista:

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

Il tentativo di forzare 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'

Tuttavia, a quanto pare sono autorizzato a costringere una lista al personaggio, non mi aspettavo questo risultato:

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

Piuttosto, se mi è permesso di forzare le liste al personaggio, 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"

Si noti che il modo in cui specifico gli elementi della lista influenza originariamente l'output di 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. In che modo as.character le informazioni dalla mia creazione originale della lista l per sputare fuori 1:3 contro c(1,2,3) .
  2. In quali circostanze dovrei farlo, esattamente? Quando dovrei voler chiamare as.character() in una lista e ottenere l'output di questo modulo?

Answer #1

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 si depone come 1:n .

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

  2. Nessuna idea :-)

... ma guardate deparse se volete capire come 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)




coercion