2012-01-28 22 views
22

Mam listę obiektów. Jak mogę pobrać nazwę tylko jednego obiektu z listy? Tak jak w:ekstrakt nazwy obiektów z listy

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 

nazwy (LISTA) są nieprawidłowe, ponieważ zwracają "A" i "B".

Tylko w kontekście wykreślam serię ramek danych, które są przechowywane na liście. Gdy wchodzę do każdego pliku data.frame, chcę podać nazwę pliku data.frame jako tytuł. Zatem odpowiedź nazw (LISTA) [1] również nie jest poprawna.

EDIT: dodałem kod więcej kontekście problemu

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) 

Jeśli to działa nazwami X i Y będą w kolorze czerwonym w górnej części obu działek

+0

Ale, ale, ale ... nigdy nie dał nazwę do data.frame. Jak mamy wydrukować coś, co nie istnieje? –

+0

@DWin true, ale gdy zawijam wektory do tabeli i ramek danych, zachowuje oryginalne nazwy wektorowe w L2. 'Browser()' po L2 i i 'names (L2)' ujawnia te nazwy 'Browse [1]> (L2) [1]" x "" y "' –

+0

Tak więc, czy chcesz nazwy kolumn lub imię przedmiotu? –

Odpowiedz

8

dokonując niewielkiej uszczypnąć do funkcji wewnątrz i korzystania lapply na indeksie zamiast listy rzeczywistej dostaje ten sam sposób, co chcesz

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

Dziękuję, że działa idealnie. Myślałem, że może być lapieżne rozwiązanie, ale mój makaron nie mógłby tak myśleć. –

53

Tak, to istnieje :) wystarczy użyć

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

Oczywiście nazwiska pierwszego elementu jest tylko

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

Dodałem więcej kontekstu dla jasności, ale nazwy (LISTA) [1] nie działa. –

+1

Oczywistym rozwiązaniem jest zastąpienie 'lapply' pętlą i skończysz ... Wątpię, czy istnieje jakikolwiek czysty sposób, jak w przypadku' lapply' twoja funkcja nie wie, który indeks przetwarza. –

+0

Obawiałem się, że pętla jest odpowiedzią. Naprawdę źle z pętlami. R jest moim jedynym językiem, więc bez zastosowanego rozwiązania jestem zagubiony lub bardzo zdezorientowany. –