首页 > 解决方案 > uiOutput 和 renderUI 不起作用(R Shiny)

问题描述

我正在尝试创建一个应用程序,它会创建一个简单actives$name的字符串列表 (),并向我展示这些字符串。由于某种原因,它不起作用。这是代码:

library(shiny)

ui <- fluidPage(

  sidebarLayout(
    mainPanel(
      textInput(inputId = "name", label = "Name", value = "foo"),
      actionButton(inputId = "add", label = "Add")
    ),
    sidebarPanel(
      uiOutput("activeB")
    )
  ),

)

server <- function(input, output, session) {

  actives <- reactiveValues()

  observeEvent(input$add,{
    actives$name <- c(actives$name, input$name)
  })

  output$activeB <- renderUI({
    for (i in 1:length(actives$name)) {
      p("Name:")
      verbatimTextOutput(actives$name[i])
      print(actives$name[i])
    }
  })

}

shinyApp(ui = ui, server = server)

print()我在循环中使用的显示for了正确的结果,所以它“知道”我正在尝试做什么。它只是不输出它。我究竟做错了什么?

标签: rshiny

解决方案


有趣的一个。花了我几次去得到它。您需要将renderUI输出包装在tagList

  output$activeB <- renderUI({
    tagList(HTML(paste(actives$name, collapse="<br>")))
  })

两个观察:

  • 您的演示代码永远不会起作用,因为您的调试print循环是 中的最后一条语句renderUI,因此renderUI永远不会返回任何内容。:(
  • 你知道不用uiOutputand也能得到同样的效果renderUI,对吧?我假设您已经简化了实际用例以专注于问题 - 在这种情况下,谢谢!:)

完整代码:

library(shiny)

ui <- fluidPage(
  sidebarLayout(
    mainPanel(
      textInput(inputId = "name", label = "Name", value = "foo"),
      actionButton(inputId = "add", label = "Add")
    ),
    sidebarPanel(
      uiOutput("activeB")
    )
  )
)

server <- function(input, output, session) {
  actives <- reactiveValues(
    name=c()
  )
  observeEvent(input$add,{
    actives$name <- c(actives$name, input$name)
  })
  output$activeB <- renderUI({
    tagList(HTML(paste(actives$name, collapse="<br>")))
  })
}

shinyApp(ui = ui, server = server)

推荐阅读