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