2012-01-28 21 views
22

Tengo una lista de objetos. ¿Cómo tomo el nombre de un solo objeto de la lista? Como en:extraer nombres de objetos de la lista

LIST <- list(A=1:5, B=1:10) 
LIST$A 
some.way.cool.function(LIST$A) #function I hope exists 
"A" #yay! it has returned what I want 

nombres (LISTA) no es correcto porque devuelve "A" y "B".

Solo para el contexto Estoy trazando una serie de marcos de datos que se almacenan en una lista. Cuando llego a cada data.frame, quiero incluir el nombre de data.frame como título. Entonces, una respuesta de nombres (LIST) [1] tampoco es correcta.

EDIT: He añadido código para más contexto al problema

x <- c("yes", "no", "maybe", "no", "no", "yes") 
y <- c("red", "blue", "green", "green", "orange") 
list.xy <- list(x=x, y=y) 

WORD.C <- function(WORDS){ 
require(wordcloud) 

L2 <- lapply(WORDS, function(x) as.data.frame(table(x), stringsAsFactors = FALSE)) 

    FUN <- function(X){ 
     windows() 
     wordcloud(X[, 1], X[, 2], min.freq=1) 
     mtext(as.character(names(X)), 3, padj=-4.5, col="red") #what I'm trying that isn't working 
    } 
    lapply(L2, FUN) 
} 

WORD.C(list.xy) 

Si esto funciona los nombres x e y estará en rojo en la parte superior de las dos parcelas

+0

Pero, pero, pero ... nunca se le dio un nombre al data.frame. ¿Cómo se supone que debemos imprimir algo que no existe? –

+0

@DWin verdadero, pero cuando envuelvo los vectores en una tabla y marco de datos, conserva los nombres de vectores originales en L2. Un 'navegador()' después de L2 yy 'nombres (L2)' revela este 'Browse [1]> nombres (L2) [1]" x "" y "' –

+0

¿Querías los nombres de las columnas o el nombre del objeto? –

Respuesta

8

Haciendo un pequeño pellizco a la función en el interior y el uso de lapply en un índice en lugar de la lista en sí obtiene esta haciendo lo que quiere

x <- c("yes", "no", "maybe", "no", "no", "yes") 
y <- c("red", "blue", "green", "green", "orange") 
list.xy <- list(x=x, y=y) 

WORD.C <- function(WORDS){ 
    require(wordcloud) 

    L2 <- lapply(WORDS, function(x) as.data.frame(table(x), stringsAsFactors = FALSE)) 

    # Takes a dataframe and the text you want to display 
    FUN <- function(X, text){ 
    windows() 
    wordcloud(X[, 1], X[, 2], min.freq=1) 
    mtext(text, 3, padj=-4.5, col="red") #what I'm trying that isn't working 
    } 

    # Now creates the sequence 1,...,length(L2) 
    # Loops over that and then create an anonymous function 
    # to send in the information you want to use. 
    lapply(seq_along(L2), function(i){FUN(L2[[i]], names(L2)[i])}) 

    # Since you asked about loops 
    # you could use i in seq_along(L2) 
    # instead of 1:length(L2) if you wanted to 
    #for(i in 1:length(L2)){ 
    # FUN(L2[[i]], names(L2)[i]) 
    #} 
} 

WORD.C(list.xy) 
+0

Gracias que funciona a la perfección. Pensé que podría haber una solución de aplicación, pero mis fideos no podían pensar de esa manera. –

53

Sí, existe :) Sólo tiene que utilizar

> names(LIST) 
[1] "A" "B" 

Obviamente los nombres del primer elemento es sólo

> names(LIST)[1] 
[1] "A" 
+1

Agregué más contexto para mayor claridad, pero los nombres (LISTA) [1] no funcionan. –

+1

La solución obvia es reemplazar el 'lapply' con un bucle y listo ... Dudo que haya una salida limpia ya que con' lapply' su función no sabe qué índice está procesando. –

+0

Tenía miedo de que un bucle fuera la respuesta. Estoy muy mal con los bucles. R es mi único idioma, así que sin una solución de aplicación estoy perdido o muy desorientado. –

Cuestiones relacionadas