我有一个包含两个闪亮输入的tagList,inputs。我想为每个输入提取label标签。我原本希望htmltools有一个getter函数来实现这一点,但是如果没有getter函数,我定义了一个函数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中完成吗?我在包手册中找不到任何相关的getter。
发布于 2019-09-29 04:16:07
你可以做的:
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() %>% listhttps://stackoverflow.com/questions/58144649
复制相似问题