Структура списка строк в R

Я все больше работаю с сильно вложенными списками, например:

mynestedlist<-list(list(LETTERS,month.name),list(list(seq(1,100,5),1,1),seq(1,100,5),seq(1,100,5)))

и иногда я изо всех сил пытаюсь понять структуру списка, над которым я работаю. Мне было интересно, есть ли способ показать иерархическую структуру списка, возможно, используя диаграммы, подобные дендрограмме.

Я знаю, что я могу использовать str для печати структуры списка:

str(mynestedlist,max.level=1)

Однако графический способ отображения списков был бы более полезен!

Ответ 1

Вы можете проверить пакет data.tree. Это позволяет легко печатать вложенный список, и вам не нужно писать сложную функцию. Вот пример:

library(data.tree)
> dt <- FromListSimple(mynestedlist)
> dt
  levelName
1 Root     
2  ¦--1    
3  °--2    
4      °--1

Это позволяет проверить на уровне списка, и вы можете комбинировать его с str, чтобы получить полное представление о структуре списка.

Ответ 2

Вы также можете сделать отличную рекурсию, если хотите:

get_str_recur <- function(x,text2,y){

  text <- paste0(text2,"Element[",y,"] is a List of length ",length(x), " --> ")

  for (i in (1:(length(x)))){
    subs <- x[[i]]
    if (is.list(subs)){
      get_str_recur(subs,text,i)

    }else{
      print(paste0(text," Element [",i,"] is a ",class(subs)," of length ",length(subs)))
    }
  }
}
get_str_recur(mynestedlist,"",0)

#[1] "Element[0] is a List of length 2 --> Element[1] is a List of length 2 --#>  Element [1] is a character of length 26"
#[1] "Element[0] is a List of length 2 --> Element[1] is a List of length 2 -->  #Element [2] is a character of length 12"
#[1] "Element[0] is a List of length 2 --> Element[2] is a List of length 3 --> #Element[1] is a List of length 3 -->  Element [1] is a numeric of length 20"
#[1] "Element[0] is a List of length 2 --> Element[2] is a List of length 3 --> #Element[1] is a List of length 3 -->  Element [2] is a numeric of length 1"
#[1] "Element[0] is a List of length 2 --> Element[2] is a List of length 3 --> #Element[1] is a List of length 3 -->  Element [3] is a numeric of length 1"
#[1] "Element[0] is a List of length 2 --> Element[2] is a List of length 3 -->  #Element [2] is a numeric of length 20"
#[1] "Element[0] is a List of length 2 --> Element[2] is a List of length 3 -->  #Element [3] is a numeric of length 20"

Это обеспечивает красивую графическую схему каждой ветки дерева списка.