如何在R Shiny的renderText中添加项目符号?

14

我正在使用renderText在我的Shiny Web应用中展示一些动态输出。那么,如何在动态输出中包含项目符号?


通过返回完整的"<ul><li>...文本...</li><li>...更多文本...</li></ul>"响应,也许可以解决这个问题? - hrbrmstr
@hrbrmstr 谢谢,但是 renderText("<ul><li>...text...</li><li>...more text...</li></ul>") 不起作用,因为 HTML 标签也会随着文本一起输出。 - mchen
你能把它切换到 verbatimTextOutput 吗?- http://www.inside-r.org/packages/cran/shiny/docs/verbatimTextOutput?我刚意识到我的本地示例使用的是HTML,而不是 renderText - hrbrmstr
如果您熟悉Markdown,您还可以在renderUI中使用includeMarkdown功能。 - Stéphane Laurent
3个回答

23

如果您使用的是 UI.R 而不是自定义的 HTML UI,则应该能够使用 HTML 函数或 tags 函数来实现此功能。

请注意,我是凭记忆编写的,所以代码未经测试。

HTML("<ul><li>...text...</li><li>...more text...</li></ul>")
或者
tags$div(
  tags$ul(
     tags$li("text")
  )
)

更新:我最初错过了您问题中的dynamic一词,这就是为什么我只提到了UI.R(感谢@StephaneLaurent指出)。

为了使您的项目列表变得动态,您应该在server.R中使用renderUI。此函数期望它所包装的表达式是HTML。然后,您可以使用uiOutputUI.R中指定列表的位置。

代码大致如下:

UI.R

#other elements before the list
uiOutput("myList")
#other elements after the list

server.R

output$myList <- renderUI(HTML("<ul><li>...text...</li><li>...more text...</li></ul>"))

您可以在文档中找到有关renderUI的更多信息,并在教程中获得有关动态 UI 使用它的简要说明。


是的,但我认为他必须使用renderUI而不是renderText - Stéphane Laurent
据我所知,您不需要任何render*函数。 您可以直接放置HTMLtags。 无论如何,在之前的Shiny版本(0.7.0)中,我在使用renderUI时遇到了问题,因为它没有正确呈现特殊转义字符,例如&uacute;。 当然,这可能已经在后来的版本中得到了纠正。 - Guillem Vicens
OP要求一个动态输出。 - Stéphane Laurent
哦,对不起,你说得对。我在阅读问题时错过了动态单词。我会编辑我的答案,包括你的建议。谢谢提示。 :-) - Guillem Vicens
@JdP,这取决于您的需求,但我认为您可以像适合传递给“HTML”调用的html字符串一样预先生成它。 - Guillem Vicens
@GuillemVicens,是的,那个可以。你可以使用:paste('<ul><li>', paste(unlist(dynamicList), collapse = '<ul><li>'), '<ul><li>') - JdP

1
我经常使用类似以下的函数,然后将其包装在renderUI/uiOutputrenderText/htmlOutput中:
#' Format character vector into HTML bulleted list
#' 
#' @param char a character vector. Each element will be a bullet
#' @param ordered logical (T/F). If `TRUE`, return numbered list.
#' 
#' @keywords internal
format_html_list <- function(char, ordered = FALSE){
  
  seps <- c("<li>", "</li>")
  html_wrapper <-  if(ordered) c("<ol>", "</ol>") else c("<ul>", "</ul>")
  
  bullets <- paste0(seps[1], char, seps[2], collapse = "")
  
  html_list <- paste0(html_wrapper[1], bullets, html_wrapper[2])
  
  return(html_list)
}

示例

ui <- fluidPage(
  htmlOutput("bulleted_list")
)

server <- function(input, output, session) {
  output$bulleted_list <- renderText({
    format_html_list(c("hello", "there"))
  })
}

shinyApp(ui, server)

result


-1

我刚遇到了同样的问题,并想出了一种使用Markdown格式的方法。

ui.R:

uiOutput("myList")

server.R:

output$myList <- renderUI(HTML(markdown::renderMarkdown(text = "- item1\n- item2\n- item3\n"
)))

如果您有一个动态项目的向量,您可以使用paste()paste0()来动态构建项目列表的Markdown,就像这样:
items <- c("item1", "item2", "item3")
paste(paste0("- ", items, "\n"), collapse = "")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接