Подтвердить что ты не робот

Извлекать имена объектов из списка

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

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

names (LIST) неверно, потому что он возвращает "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)

Если это работает, имена x и y будут красными в верхней части обоих графиков

4b9b3361

Ответ 1

Выполняя небольшую настройку внутренней функции и используя 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)

Ответ 2

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

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

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

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