【问题标题】:How to create an adaptative list (ul+li) using htmltools?如何使用 htmltools 创建自适应列表 (ul+li)?
【发布时间】:2020-05-10 12:13:45
【问题描述】:

在 Shiny 应用程序的上下文中,我试图将某些调用引发的警告显示为 HTML 列表。

感谢this answer,我可以将所有警告作为字符向量来获取,我现在实际上正在构建 HTML 列表。

我能想到的最简单的方法是这段代码:

warns = c("warning 1", "warning 2", "warning 3", "warning 4")
paste0("<ul><li>", paste0(warns, collapse = "</li><li>"), "</li></ul>") %>% HTML

shiny::renderUI内部,这段代码输出良好,但不是很干净,即使经过彻底的测试,我仍然发现它容易出错。

因此,我想使用包htmltools 来构建列表,因为这似乎是使用 R 编写 HTML 的推荐方式。

但是,tags$li 只能处理字符串而不能处理字符向量,并且tags$ul 使用省略号而不是列表或向量,因此即使使用循环我也无法构建我的列表。

使用htmltools 构建 HTML 列表的最佳方法是什么?

【问题讨论】:

    标签: r html-lists htmltools


    【解决方案1】:

    有几种方法可以构建此列表。根据应用程序的目的以及如果您想要运行控制 HTML 标记的其他逻辑,您可以使用元素 ul$childrenchildren 属性编写列表项或一次性运行它。

    子元素的标记可以使用基本的应用函数来完成(即,lapply 可能是更好的选择,因为你想返回一个闪亮的标签对象)。或者,purrr 包很好,而且速度更快。但是,如果您要渲染数百个元素,我会考虑预先生成标记。

    使用...$children 方法。以下是生成 html 的方法。

    library(htmltools)
    warns <- c("warning 1", "warning 2", "warning 3", "warning 4")
    
    ul <- tags$ul()
    ul$children <- lapply(seq_len(length(warns)), function(index) {
        tags$li(warns[index])
    })
    

    如果你想一次性生成标记,你可以这样做。

    library(htmltools)
    warns <- c("warning 1", "warning 2", "warning 3", "warning 4")
    
    ul <- tags$ul(
        lapply(seq_len(length(warns)), function(index) {
            tags$li(warns[index])
        })
    )
    

    编辑:我忘记使用 purrr 包添加示例

    # using ul$children
    warns <- c("warning 1", "warning 2", "warning 3", "warning 4")
    ul <- tags$ul()
    ul$children <- purrr::map(warns, function(.x) tags$li(.x))
    
    
    # generating everything at once
    warns <- c("warning 1", "warning 2", "warning 3", "warning 4")
    ul <- tags$ul(
        purrr::map(warns, function(.x) tags$li(.x))
    )
    

    【讨论】:

      猜你喜欢
      • 2014-03-25
      • 2022-08-03
      • 2015-07-03
      • 2018-07-16
      • 2021-08-12
      • 2015-06-14
      • 2011-12-04
      • 2015-09-25
      • 1970-01-01
      相关资源
      最近更新 更多