Элемент списка доступа в 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
Какие-нибудь советы? Я зацикливаюсь над вектором строк, которые идентифицируют имена списков, и это было бы действительно полезно.
Ответы
Ответ 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/