В настоящее время я создаю рекурсивный цикл в 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

Почему это происходит?

-1
Esben Eickhardt 24 Апр 2017 в 17:30

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
1
CJ Yetman 24 Апр 2017 в 15:59

Я не уверен, что вы пытаетесь сделать, но это более простая версия того, что вы сделали:

> 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
0
Metamorphic 24 Апр 2017 в 14:37