2012-01-28 2 views
22

У меня есть список объектов. Как получить имя одного объекта из списка? Как и в случае:извлечь имена объектов из списка

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 

Имена (СПИСОК) неверны, поскольку они возвращают «A» и «B».

Просто для контекста Я рисую серию кадров данных, которые хранятся в списке. Когда я прихожу к каждому data.frame, я хочу включить имя data.frame в качестве заголовка. Таким образом, ответ имен (LIST) [1] неверен.

EDIT: Я добавил код для более контекста проблемы

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) 

Если это работает на имена х и у будет светиться красным цветом в верхней части обоих участков

+0

Но, но, но ... ты никогда не дал имя к кадру данных. Как мы должны печатать что-то, чего не существует? –

+0

@DWin true, но когда я переношу векторы в таблицу и данные, он сохраняет исходные имена векторов в L2. «Browser()» после L2 и «names (L2)» показывает это «Browse [1]> names (L2) [1]« x »« y »' –

+0

Так вы хотели, чтобы имена столбцов или имя объекта? –

ответ

8

Создание небольшой настройки для внутренней функции и используя lapply по индексу вместо самого фактического списка получает это делать то, что вы хотите

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

Спасибо, что работает отлично. Я думал, что это может быть решение, но моя лапша не могла так думать. –

53

Да, она существует :) Просто используйте

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

Очевидно имена первого элемента просто

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

Я добавил больше контекста для ясности, но имена (LIST) [1] не работают. –

+1

Очевидное решение заменить «lapply» на цикл, и вы закончили ... Я сомневаюсь, что есть какой-то чистый выход, так как с помощью 'lapply' ваша функция не знает, какой индекс обрабатывается. –

+0

Я боялся, что это был ответ. Мне очень плохо с петлями. R - мой единственный язык, поэтому без применения приложения я теряюсь или очень дезориентирован. –

Смежные вопросы