我需要你的帮助,因为我不知道如何解决我的问题。我有我的闪亮应用程序,我有数据框(从文件导入)和checkboxgroupinput我可以标记哪些列对我来说很有趣。之后在其他tabpanel中,我想为每列获得两个图(在一个facet_wrap中)。所有facet_wrap一个在另一个之下。问题是有趣列的数量不是恒定的。如果我可以用图表硬编码行数,那么这很容易,但是它可以动态改变的地方我不知道如何编程它,来自你身边的任何提示?
答案 0 :(得分:0)
如果没有可重复的示例,我们无法解决您的问题,但您应该能够从使用uiOutput
和renderUI
的快速示例中找到答案。这允许在UI元素中使用动态值。
通常您将静态输入定义为checkboxGroupInput("columns", "Select the variables to plot", choices = vector_of_known_values)
。
但是根据您的问题,如果事先不知道数据集(例如:用户文件上传),则此方法无效。在这种情况下,在UI部分中使用uiOutput
:uiOutput("ui")
,以便将评估延迟到服务器端。在服务器端,无论数据结构如何,您都可以动态设置choices
。
output$ui <- renderUI( {
checkboxGroupInput("columns", "Select the variables to plot", choices = colnames(rv$data))
})
参见完整示例:
library(shiny)
library(DT)
library(dplyr)
ui <- fluidPage(
sidebarLayout(
sidebarPanel(
selectInput("datasets", "Select a dataset", choices = c("mtcars", "iris"), selected = "mtcars"),
uiOutput("ui")
),
mainPanel(
DT::dataTableOutput("table")
)
)
)
server <- function(input, output, session) {
rv <- reactiveValues(data = NULL)
observe( {
rv$data <- eval(parse(text = input$datasets))
})
filtered <- reactive( {
req(input$columns)
if( all(!input$columns %in% colnames(rv$data))) {
NULL
} else {
rv$data %>% select(input$columns)
}
})
output$ui <- renderUI( {
checkboxGroupInput("columns", "Select the variables to plot", choices = colnames(rv$data))
})
output$table <- DT::renderDataTable( {
req(filtered())
DT::datatable(filtered())
})
}
shinyApp(ui, server)