在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有可能是这样吗?
答案 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评论中提供的链接为此目的使用insertUI
和removeUI
。
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)