В настоящее время я создаю рекурсивный цикл в R, где я должен отслеживать, насколько глубоко я нахожусь во вложенном списке. Я, однако, столкнулся с проблемами при подсчете во вложенных списках.
Вот проблема проиллюстрирована:
У меня есть список
myList <- list()
Я проверяю значение случайного индекса в списке
myList[["test1"]]
NULL
Я могу суммировать это значение и получить ноль
sum(myList[["test1"]])
0
Теперь я назначаю значение этому индексу
myList[["test1"]] <- sum(myList[["test1"]]) + 1
Далее я хочу сделать то же самое, только глубже в списке
myList[["test1"]][["test2"]]
Error in myList[["test1"]][["test2"]] : subscript out of bounds
Почему это происходит?
2 ответа
Когда вы устанавливаете значение myList[["test1"]]
с помощью ...
myList[["test1"]] <- sum(myList[["test1"]]) + 1
myList[["test1"]]
становится числовым вектором из 1 элемента, а не списком
Если вы хотите создать test1
список, одним из его элементов является другой (под) список с именем test2
, вы можете сделать это ...
myList <- list()
myList[["test1"]] <- list(sum(myList[["test1"]]) + 1)
myList[["test1"]]["test2"] <- list(sum(myList[["test1"]][[1]]) + 1)
myList
myList$test1
myList$test1$test2
Я не уверен, что вы пытаетесь сделать, но это более простая версия того, что вы сделали:
> x<-1
> x[["test2"]]
Error in x[["test2"]] : subscript out of bounds
Здесь x
- числовой вектор. На него все еще можно подписать, используя [[
, но в x
нет элемента с именем test2
, поэтому вы получаете ошибку «вне границ» при попытке доступа к этому элементу.
Даже вектор с более чем одним элементом даст эту ошибку:
> c(1,2)[["test2"]]
Error in c(1, 2)[["test2"]] : subscript out of bounds
Однако, если мы назовем один из них test2
, тогда подписка вернет что-то:
> c(1,2,test2=3)[["test2"]]
[1] 3
Похожие вопросы
Новые вопросы
r
R - это бесплатный язык программирования с открытым исходным кодом и программная среда для статистических вычислений, биоинформатики, визуализации и общих вычислений. Пожалуйста, предоставьте минимальные и воспроизводимые примеры вместе с желаемым результатом. Используйте dput () для данных и укажите все небазовые пакеты с вызовами library (). Не вставляйте изображения для данных или кода, вместо этого используйте блоки кода с отступом. По вопросам, связанным со статистикой, используйте https://stats.stackexchange.com.