0

我有tagList两个闪亮的输入,inputs. 我想label为每个输入提取标签。我希望htmltools有一个 getter 函数来实现这一点,但在没有一个函数的情况下,我定义了一个函数 ,getLabel它通过输入列表递归并提取其 name 元素等于 value 的子列表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)

问题是结果列表包含零长度子列表。我想要的输出是“闪亮标签”类的两个元素(每个输入的标签)的列表。我怎样才能修改我的功能来实现这一点?另外,这可以做htmltools吗?我在包装手册中找不到任何相关的吸气剂。

4

1 回答 1

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
于 2019-09-28T20:16:06.887 回答