首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用htmltools创建自适应列表(ul+li)?

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

Stack Overflow用户
提问于 2020-05-10 20:13:46
回答 1查看 168关注 0票数 0

在一个出色的应用程序的上下文中,我试图将某些调用抛出的警告显示为HTML列表。

多亏了this answer,我可以得到所有的警告作为一个字符向量,现在我实际上正在构建HTML。

我能想到的最简单的方法是下面的代码:

代码语言:javascript
复制
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构建超文本标记语言列表的最佳方法是什么

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-05-10 21:38:15

有几种方法可以构建这个列表。根据应用程序的目的以及是否要运行控制HTML标记的附加逻辑,可以使用元素ul$childrenchildren属性编写列表项,也可以一次性运行它。

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

使用...$children方法。下面是如何生成html的方法。

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

如果你想在一次运行中生成标记,你可以这样做。

代码语言:javascript
复制
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包添加示例

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

https://stackoverflow.com/questions/61711777

复制
相关文章

相似问题

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