如何使用 htmltools 创建自适应列表 (ul+li)?

How to create an adaptative list (ul+li) using htmltools?

在 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 列表的最佳方法是什么?

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

子元素的标记可以使用基本应用函数完成(即,lapply 可能是更好的选择,因为您想要 return 闪亮的标签对象)。或者,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))
)