У меня есть список из двух входных данных, inputs
, который содержит selectInput
и checkboxInput
.Я хотел бы пройтись по этому списку входов, 1) извлечь тег метки каждого входа и затем 2) установить стиль каждого тега метки в исходном списке до display:none;
.Мне было интересно, есть ли в пакете Shiny функции получения и установки для этого?
Самой близкой вещью, которую я смог найти, была эта статья о построении пользовательских вводов , но геттеры - это функции JS.
Поэтому я прибег к определению своей собственной функции, которая рекурсивно просматривает список входов и использует некоторые методы получения из htmltools
:
library(shiny)
library(htmltools)
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'))) {
tagGetAttribute(x, 'id')
getLabel2(x$children)
} else {
return(x)
}
})
}
labels = getLabel(inputs)
Однако с этой функцией есть некоторые проблемы:
- Возвращает список, содержащий теги меток и
NULL
s вместо тегов без меток - как я могу изменить его так, чтобы он возвращал список длины 2, где первый элемент - этотег label для входа 1, а второй элемент - это тег label для входа 2? - Он не проверяет, соответствует ли извлекаемый тег label соответствующему входному тегу этого
shiny-input-container
.Я думал, что вы могли бы сделать это, проверив, что атрибут for
тега label (полученный с помощью tagGetAttribute(label_tag, 'for')
) соответствует атрибуту id
соответствующего входного тега (полученного с помощью tagGetAttribute(input_tag, 'id')
) - но я нене знаю, возможно ли это, поскольку входной тег не легко идентифицировать.Разрешено ли shiny-input-container
иметь только один дочерний тег?Если это так, то эта проверка не нужна.