在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
可能是更好的选择,因为您想返回一个闪亮的标签对象)。另外,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))
)