R Shiny & htmltools - Извлечение тега по имени

У меня есть tagList двух блестящих входов, inputs. Я хотел бы извлечьlabelтег для каждого входа. Я надеялся чтоhtmltools для этого была функция получения, но в отсутствие таковой я определил функцию, getLabel, который рекурсивно просматривает входной список и извлекает подсписки, элемент имени которых равен значению label. Вот мой код:

library(htmltools)
library(shiny)

inputs = tagList(
    selectInput('first', 'FIRST', letters), 
    checkboxInput(inputId = 'second', label = 'SECOND')
)

getLabel2 <- function(children) {

  lapply(children, function(x) {

    if(inherits(x, 'shiny.tag')) {

      if(x$name == 'label') {

        return(x)

      } else {

        chldn = x$children

        if(is.list(chldn)) getLabel2(chldn)

      }

    }

  })

}


getLabel <- function(inputs) {

  lapply(inputs, function(x) {

    if(grepl('shiny-input-container', tagGetAttribute(x, 'class'))) {

      getLabel2(x$children)

    } else {

      return(x)

    }

  })
}

labels = getLabel(inputs)

Проблема в том, что полученный список включает подсписки нулевой длины. Мой желаемый результат - это список из двух элементов (метка для каждого входа) класса shiny-tag. Как я могу изменить свою функцию для этого? Кроме того, это можно сделать вhtmltools? Я не могу найти подходящих геттеров в руководстве по пакету.

1 ответ

Вы могли сделать:

inputs %>% toString %>% read_html %>% html_nodes(xpath = "//label") %>% html_text() %>% list

Пояснение:

блестящие вводы - это в основном код HTML. То же самое и дляtagList(). (Вы можете проверить это, запустивselectInput или ваша переменная inputsв вашей консоли...). Таким образом, вы можете использовать xpath / css для анализа полученного xml-документа.

С htmltools может быть другой способ, это просто пришло мне в голову, когда я подумал о том, что блестящие входы - это в основном html-код.

Воспроизводимый пример:

library(shiny)
library(rvest)
library(magrittr)

inputs = tagList(
  selectInput('first', 'FIRST', letters), 
  checkboxInput(inputId = 'second', label = 'SECOND')
)

inputs %>% toString %>% read_html %>% 
   html_nodes(xpath = "//label") %>% html_text() %>% list
Другие вопросы по тегам