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

Элемент списка доступа в r, используя get()

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

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

Ошибка в get ( "example.list $attribute" ): object 'example.list $attribute' not found

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

4b9b3361

Ответ 1

Здесь заклинание, которое вы, вероятно, ищете:

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" 

Ответ 2

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

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]]

Ответ 3

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

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

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

> parsed <- unlist(strsplit(string, "\\$"))
> get(parsed[1])[[parsed[2]]]
[1] "test"

Ответ 4

Ответ на 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 функция заканчивается выдачей полученной матрицы.

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

"Второй пример" /тангенциальная информация, касающаяся применения в оценках факторного коэффициента оценки:

Здесь функция, которую я описал выше, на всякий случай, если кто-то хочет рассчитать оцененные коэффициенты модельного коэффициента ответа * большими партиями... Каждый столбец выходной матрицы соответствует элементу списка ( т.е. скрытый признак с порядковыми элементами индикатора, указанными в имени столбца в элементе списка), а строки соответствуют строкам фрейма данных, используемым в качестве входных данных. Каждая строка должна, по-видимому, содержать взаимозависимые наблюдения, как от конкретного человека, которому принадлежит фактор в той же строке матрицы вывода. Кроме того, я считаю, что добавить, что если все элементы в определенном элементе списка используют те же самые параметры рейтинга шкалы Likert, модель оцененного ответа может быть менее подходящей для оценки коэффициента, чем модель рейтингового шкалы (см. 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 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 для моделирования скрытых переменных и анализа теории ответов, Journal of Statistical Software, 17 (5), 1-25. URL: http://www.jstatsoft.org/v17/i05/