2011-04-16 11 views
35

Me gustaría configurar una lista con entradas con nombre cuyos valores no se hayan inicializado (planeo agregarles más cosas). ¿Cómo hace la gente en general? He hecho:¿Cómo crear una lista con nombres pero sin entradas en R/Splus?

mylist.names <- c("a", "b", "c") 
mylist <- as.list(rep(NA, length(mylist.names))) 
names(mylist) <- mylist.names 

pero esto parece un poco hacky. Tiene que haber una forma más estándar de hacer esto ... ¿verdad?

+0

vagamente relacionada: http://stackoverflow.com/questions/5042806/r-creating-a-named-vector-from-variables/5043280 # 5043280 – Andrie

Respuesta

45

lo haría así:

mylist.names <- c("a", "b", "c") 
mylist <- vector("list", length(mylist.names)) 
names(mylist) <- mylist.names 
+13

Hay una función para establecer nombres: 'setNames (vector (" list ", length (mylist.names)), mylist.names)'. – Marek

+2

Siempre depende de lo que quiere archivar. Por lo general, me gusta dividir los pasos para facilitar la lectura del código. R/Splus tiende a permitirle escribir un montón de cosas en una sola línea, lo cual está bien para las pruebas y para terminar rápido, pero no para la legibilidad. – Thilo

21

Un poco más corta que la versión Thilo :)

mylist <- sapply(mylist.names,function(x) NULL) 
+2

Me gusta. Una cosa para agregar, si sus nombres son números, los valores numéricos se ignoran como nombres, y solo se usan 1, 2, 3 ... Para eludir eso, intente: 'sapply (como.caracter (4: 6), function (x) NULL)' – mpettis

+2

Tenga cuidado con el uso de 'sapply' dentro de una función https://twitter.com/hadleywickham/status/434339083871993856 – Jubbles

+0

Usted puede reemplazar 'sapply' con' purrr :: map' usando 'mylist <- purrr :: map (mylist.names, ~ NULL)' – psychonomics

8

Otra forma difícil de hacerlo:

mylist.names <- c("a", "b", "c") 

mylist <- NULL 
mylist[mylist.names] <- list(NULL) 

Estos trabajos porque reemplazas las entradas no existentes para que se creen. lamentablemente se requiere la lista (NULL), ya que NULL significa eliminar una entrada:

x <- list(a=1:2, b=2:3, c=3:4) 
x["a"] <- NULL # removes the "a" entry! 
x["c"] <- list(NULL) # assigns NULL to "c" entry 
+2

Probablemente usaría 'mylist <- list()' porque muestra más claramente que está inicializando una lista vacía. De hecho, estoy algo sorprendido de que funcione con establecerlo en 'NULL'. Supongo que 'mylist' se promociona de' NULL' a una lista cuando se le asigna de esa manera. –

Cuestiones relacionadas