Доступ к элементу списка в r с помощью get () - PullRequest
14 голосов
/ 26 февраля 2012

Я пытаюсь использовать get () для доступа к элементу списка в r, но получаю ошибку.

example.list <- list()
example.list$attribute <- c("test")
get("example.list") # Works just fine
get("example.list$attribute") # breaks

Ошибка при получении («example.list $ attribute»): объект «example.list $ attribute» не найден

Есть советы?Я зацикливаюсь на векторе строк, которые идентифицируют имена списков, и это было бы очень полезно.

Ответы [ 4 ]

24 голосов
/ 26 февраля 2012

Вот заклинание, которое вы, вероятно, ищете:

get("attribute", example.list)
# [1] "test"

Или, возможно, для вашей ситуации это:

get("attribute", eval(as.symbol("example.list")))
# [1] "test"

# Applied to your situation, as I understand it...

example.list2 <- example.list 
listNames <- c("example.list", "example.list2")
sapply(listNames, function(X) get("attribute", eval(as.symbol(X))))
# example.list example.list2 
#       "test"        "test" 
4 голосов
/ 26 февраля 2012

Почему бы просто:

example.list <- list(attribute="test")
listName <- "example.list"
get(listName)$attribute

# or, if both the list name and the element name are given as arguments:
elementName <- "attribute"
get(listName)[[elementName]]
2 голосов
/ 26 февраля 2012

Если ваши строки содержат больше, чем просто имена объектов, например, такие операторы, как здесь, вы можете оценить их как выражения следующим образом:

> string <- "example.list$attribute"
> eval(parse(text = string))
[1] "test"

Если все ваши строки имеют тип "object $ attribute",вы также можете разобрать их в объект / атрибут, чтобы вы могли get объект, а затем извлечь атрибут с помощью [[:

> parsed <- unlist(strsplit(string, "\\$"))
> get(parsed[1])[[parsed[2]]]
[1] "test"
0 голосов
/ 06 ноября 2013

ответ flodel работал для моего приложения, поэтому я опубликую то, что я на нем построил, хотя это довольно скучно.Вы можете получить доступ к каждому элементу списка с помощью цикла for, например:

#==============  List with five elements of non-uniform length  ================#
example.list=
list(letters[1:5], letters[6:10], letters[11:15], letters[16:20], letters[21:26])
#===============================================================================#
#======  for loop that names and concatenates each consecutive element  ========#
derp=c();            for(i in 1:length(example.list))
{derp=append(derp,eval(parse(text=example.list[i])))}
derp #Not a particularly useful application here, but it proves the point.

Я использую подобный код для функции, которая вызывает определенные наборы столбцов из фрейма данных по именам столбцов.Пользователь вводит список с элементами, каждый из которых представляет разные наборы имен столбцов (каждый набор представляет собой группу элементов, принадлежащих одному показателю), и большой фрейм данных, содержащий все эти столбцы.Цикл for применяет каждый последовательный элемент списка в качестве набора имен столбцов для внутренней функции *, применяемой только к текущему именованному набору столбцов большого фрейма данных.Затем он заполняет один столбец в цикле матрицы выводом для подмножества большого фрейма данных, который соответствует именам в элементе списка, соответствующем номеру этого цикла.После цикла for функция завершается выводом той матрицы, которую она произвела.

Не уверен, что вы хотите сделать что-то похожее с элементами списка, но я рад, что подхватил этот трюк.Спасибо всем за идеи!

«Второй пример» / тангенциальная информация относительно применения в скоринговой модели фактор-скоринга :

Вот функция, которую я описал выше, просто весли кто-то хочет рассчитать баллы коэффициента модели градуированного ответа * большими партиями ... Каждый столбец выходной матрицы соответствует элементу списка (т. е. скрытой характеристике с порядковыми элементами индикатора, указанными в имени столбцав элемент списка), а строки соответствуют строкам фрейма данных, использованным в качестве входных данных.Предполагается, что каждая строка должна содержать взаимозависимые наблюдения от конкретного человека, которому принадлежат оценки факторов в той же строке матрицы выходных данных.Кроме того, я чувствую, что должен добавить, что если все элементы в данном элементе списка используют одинаковые параметры оценки по шкале Лайкерта, модель дифференцированного ответа может быть менее подходящей для оценки факторов, чем модель по шкале оценки (см. http://www.rasch.org/rmt/rmt143k.htm).

'grmscores'=function(ColumnNameList,DataFrame)   {require(ltm) #(Rizopoulos,2006)
x = matrix ( NA , nrow = nrow ( DataFrame ), ncol = length ( ColumnNameList ))
for(i in 1:length(ColumnNameList)) #flodel's magic featured below!#
{x[,i]=factor.scores(grm(DataFrame[,    eval(parse(text=   ColumnNameList[i]))]),
resp.patterns=DataFrame[,eval(parse(text= ColumnNameList[i]))])$score.dat$z1}; x}

Ссылка

* Rizopoulos, D. (2006). Ltm: пакет R для моделирования скрытой переменной и анализа теории отклика элемента, Журнал статистического программного обеспечения, 17 (5), 1-25. URL: http://www.jstatsoft.org/v17/i05/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...