如何根据R Shiny中的用户输入呈现不同数量的表?

时间:2018-04-02 14:06:25

标签: r shiny

在R闪亮的应用程序中,我尝试根据用户输入呈现不同数量的表。例如,我创建了以下应用:

# ui.R

fluidPage(
  numericInput("numeric.input", "Select Number of Tables:", 0, min = 0),
  tableOutput("table")
)

# server.R

data(iris)

function(input, output) {
  output$table <- renderTable({
    head(iris)
  })
}

此应用程序要做的是根据为numeric.input选择的值生成多个表格。目前numeric.input不会对应用程序产生影响,仅显示示例。如果numeric.input设置为零,我希望应用不显示该表的副本,如果numeric.input设置为1,我希望该应用能够显示表格的一份副本等。

R Shiny有可能是这样吗?

2 个答案:

答案 0 :(得分:1)

我使用R Shiny Gallery app on creating UI in a loop解决了这个问题,但问rendering the UI loop within the R Shiny server。以下代码正常工作:

# ui.R

fluidPage(
  numericInput("numeric.input", "Select Number of Tables:", 1, min = 1),
  uiOutput("tables")
)

# server.R

data(iris)

function(input, output) {

  # Rendering tables dependent on user input.
  observeEvent(input$numeric.input, {
    lapply(1:input$numeric.input, function(i) {
      output[[paste0('table', i)]] <- renderTable({
        head(iris)
      })
    })
  })

  # Rendering UI and outputtign tables dependent on user input.
  output$tables <- renderUI({
    lapply(1:input$numeric.input, function(i) {
      uiOutput(paste0('table', i))
    })
  })

}

答案 1 :(得分:0)

您的方法简单明了。只需根据@ r2evans评论中提供的链接为此目的使用insertUIremoveUI

ui <- fluidPage(
  numericInput("numericinput", "Select Number of Tables:", 0, min = 0),
  tags$div(id = 'tabledisplay')
)

server <- function(input, output) {
  inserted <- c()
  observeEvent(input$numericinput, {
    tablenum <- input$numericinput
    id <- paste0('table', tablenum)
    if (input$numericinput > length(inserted)) {
      insertUI(selector = '#tabledisplay',
               ui = tags$div(h4(
                 paste0("Table number ", input$numericinput)
               ), tags$p(renderTable({
                 head(iris)
               })),
               id = id))
      inserted <<- c(id, inserted)
    }
    else {
      inserted <- sort(inserted)
      removeUI(selector = paste0('#', inserted[length(inserted)]))          
      inserted <<- inserted[-length(inserted)]
    }
  })
}
shinyApp(ui, server)