vectors data advanced list r coercion

list - data - atomic vectors in r



¿Por qué este comportamiento al forzar una lista de caracteres a través de as.character()? (2)

En el proceso de (principalmente) responder a esta pregunta, me encontré con algo que siento que ya debería haber visto antes. Digamos que tienes una lista:

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

Intentar forzar l a varios tipos devuelve un error:

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

Sin embargo, aparentemente me permiten forzar una lista de caracteres, simplemente no esperaba este resultado:

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

Por el contrario, si se me permite forzar listas para el personaje, hubiera pensado que vería un comportamiento como este:

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

Tenga en cuenta que la forma en que especifico los elementos de la lista afecta originalmente a la salida de 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)"

Tengo dos preguntas:

  1. ¿Cómo está as.character dragando la información de mi creación original de la lista l para escupir 1:3 versus c(1,2,3) .
  2. ¿En qué circunstancias querría hacer esto, exactamente? ¿Cuándo quisiera llamar a as.character() en una lista y obtener el resultado de este formulario?

El archivo de ayuda dice

Para listas desparaifica los elementos individualmente, excepto que extrae el primer elemento de vectores de caracteres de longitud uno.

Lo había visto antes al intentar responder una pregunta [no en línea] sobre grep . Considerar:

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

grep usa as.character en x , con el resultado de que, dado que ambos tienen c( en ellos, ambos componentes coinciden. Eso tomó un tiempo para averiguarlo.

En " ¿Por qué hace esto? ", Supongo que uno de los miembros del núcleo R quería que hiciera esto.


Para listas no triviales, as.character usa deparse para generar las cadenas.

  1. Solo si el vector es entero y 1,2,3, ..., n - entonces se desparafila como 1:n .

    c(1,2,3) es doble, mientras que 1:3 es entero ...

  2. Ni idea :-)

... pero mira deparse si quieres entender como as.character aquí:

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)