首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >R Shiny & htmltools -按名称提取标签

R Shiny & htmltools -按名称提取标签
EN

Stack Overflow用户
提问于 2019-09-28 16:30:48
回答 1查看 407关注 0票数 0

我有一个包含两个闪亮输入的tagListinputs。我想为每个输入提取label标签。我原本希望htmltools有一个getter函数来实现这一点,但是如果没有getter函数,我定义了一个函数getLabel,它递归遍历输入列表并提取名称元素等于值label的子列表。下面是我的代码:

代码语言:javascript
复制
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。

EN

回答 1

Stack Overflow用户

发布于 2019-09-29 04:16:07

你可以做的

代码语言:javascript
复制
inputs %>% toString %>% read_html %>% html_nodes(xpath = "//label") %>% html_text() %>% list

说明:

闪亮的输入基本上是html代码。tagList()也是如此。(您可以通过在控制台中运行selectInput或您的变量inputs来检查它...)。因此,您可以使用xpath/css来解析生成的xml文档。

htmltools可能还有另一种方式,当我想到闪亮的输入基本上是html代码时,我就想到了这一点。

可重现的示例:

代码语言:javascript
复制
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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58144649

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档