Подмножество (список списков) вложенных списков - PullRequest
1 голос
/ 04 августа 2020

Я пытаюсь создать подмножество thead / tbody без прямого вызова rowlist $ td $ list $ item $ table $ thead или rowlist [[td]] [[list]] [[item]] [[table]] [[thead ]]. Этот unlist(rowlist, use.names=FALSE )[ grepl( "tbody", names(unlist(rowlist)))] служит моей цели, за исключением того, что он мне нужен как несколько строк (например, два tr в tbody) (я могу разделить его, но кажется интуитивно понятным. Я знаю, что должен быть лучший способ работы с HTML / XML, но это получил Я получил на данный момент.

str(rowlist)
List of 1
 $ td:List of 1
  ..$ list:List of 1
  .. ..$ item:List of 1
  .. .. ..$ table:List of 2
  .. .. .. ..$ thead:List of 1
  .. .. .. .. ..$ tr:List of 7
  .. .. .. .. .. ..$ th:List of 1
  .. .. .. .. .. .. ..$ : chr "Test"
  .. .. .. .. .. ..$ th:List of 1
  .. .. .. .. .. .. ..$ : chr "Outcome"
  .. .. .. .. .. ..$ th:List of 1
  .. .. .. .. .. .. ..$ : chr "Subset"
  .. .. .. .. .. ..$ th:List of 1
  .. .. .. .. .. .. ..$ : chr "Cups"
  .. .. .. .. .. ..$ th:List of 1
  .. .. .. .. .. .. ..$ : chr "Bowls"
  .. .. .. .. .. ..$ th:List of 1
  .. .. .. .. .. .. ..$ : chr "Plates"
  .. .. .. .. .. ..$ th:List of 1
  .. .. .. .. .. .. ..$ : chr "Jars"
  .. .. .. ..$ tbody:List of 2
  .. .. .. .. ..$ tr:List of 7
  .. .. .. .. .. ..$ td:List of 1
  .. .. .. .. .. .. ..$ : chr "test1"
  .. .. .. .. .. ..$ td:List of 1
  .. .. .. .. .. .. ..$ : chr "High"
  .. .. .. .. .. ..$ td:List of 1
  .. .. .. .. .. .. ..$ : chr "Low"
  .. .. .. .. .. ..$ td:List of 1
  .. .. .. .. .. .. ..$ : chr "Gold"
  .. .. .. .. .. ..$ td:List of 1
  .. .. .. .. .. .. ..$ : chr "Blue"
  .. .. .. .. .. ..$ td:List of 1
  .. .. .. .. .. .. ..$ : chr "Green"
  .. .. .. .. .. ..$ td:List of 1
  .. .. .. .. .. .. ..$ : chr "red"
  .. .. .. .. .. ..- attr(*, "ID")= chr "id_511"
  .. .. .. .. ..$ tr:List of 7
  .. .. .. .. .. ..$ td:List of 1
  .. .. .. .. .. .. ..$ : chr "test2"
  .. .. .. .. .. ..$ td:List of 1
  .. .. .. .. .. .. ..$ : chr "Low"
  .. .. .. .. .. ..$ td:List of 1
  .. .. .. .. .. .. ..$ : chr "High"
  .. .. .. .. .. ..$ td:List of 1
  .. .. .. .. .. .. ..$ : chr "Pink"
  .. .. .. .. .. ..$ td:List of 1
  .. .. .. .. .. .. ..$ : chr "Blue"
  .. .. .. .. .. ..$ td:List of 1
  .. .. .. .. .. .. ..$ : chr "Purple"
  .. .. .. .. .. ..$ td: list()
  .. .. .. .. .. ..- attr(*, "ID")= chr "id_512"
  .. ..- attr(*, "styleCode")= chr "none"

Список выглядит так

rowlist<-list(td = structure(list(list = structure(list(item = list(table = list(
  thead = list(tr = list(
    th = list("Test"), th = list("Outcome"), th = list("Set"), th = list("Cups"), th = list("Bowls"), th = list( "Plates"), th = list("Jars"))), 
  tbody = list(tr = structure(
    list(td = list("test1"), td = list("High"), td = list("Low"), td = list("Gold"), td = list("Blue"), td = list("Green"), td = list("Red")), ID = "id_511"), 
    tr = structure(
      list(td = list("test2"), td = list("Low"), td = list("High"), td = list("Pink"), td = list("Blue"), td = list("Purple"), td = list()), ID = "id_512"))))), styleCode = "none")), colspan = "20"))

1 Ответ

1 голос
/ 06 августа 2020

Если объект должен обрабатываться как вложенный список, можно использовать rrapply в rrapply -пакете (расширение base rapply):

library(rrapply)

out <- rrapply(rowlist, 
        condition = function(x, .xname) .xname %in% c("thead", "tbody"), 
        feverywhere = "break",
        how = "flatten")

str(out, list.len = 2)
#> List of 2
#>  $ thead:List of 1
#>   ..$ tr:List of 7
#>   .. ..$ th:List of 1
#>   .. .. ..$ : chr "Test"
#>   .. ..$ th:List of 1
#>   .. .. ..$ : chr "Outcome"
#>   .. .. [list output truncated]
#>  $ tbody:List of 2
#>   ..$ tr:List of 7
#>   .. ..$ td:List of 1
#>   .. .. ..$ : chr "test1"
#>   .. ..$ td:List of 1
#>   .. .. ..$ : chr "High"
#>   .. .. [list output truncated]
#>   .. ..- attr(*, "ID")= chr "id_511"
#>   ..$ tr:List of 7
#>   .. ..$ td:List of 1
#>   .. .. ..$ : chr "test2"
#>   .. ..$ td:List of 1
#>   .. .. ..$ : chr "Low"
#>   .. .. [list output truncated]
#>   .. ..- attr(*, "ID")= chr "id_512"

Здесь, функция condition возвращает только узлы с именами thead или tbody, how = "flatten" возвращает узлы в плоском списке (how = "prune" сокращает узлы, сохраняя исходную структуру списка), а feverywhere = "break" не пропускает узлы промежуточного списка (как в случае с базой rapply) при оценке condition.

...