闪亮app中动态的ggplots数量

时间:2018-01-02 00:17:07

标签: r dataframe ggplot2 shiny

我需要你的帮助,因为我不知道如何解决我的问题。我有我的闪亮应用程序,我有数据框(从文件导入)和checkboxgroupinput我可以标记哪些列对我来说很有趣。之后在其他tabpanel中,我想为每列获得两个图(在一个facet_wrap中)。所有facet_wrap一个在另一个之下。问题是有趣列的数量不是恒定的。如果我可以用图表硬编码行数,那么这很容易,但是它可以动态改变的地方我不知道如何编程它,来自你身边的任何提示?

1 个答案:

答案 0 :(得分:0)

如果没有可重复的示例,我们无法解决您的问题,但您应该能够从使用uiOutputrenderUI的快速示例中找到答案。这允许在UI元素中使用动态值。

通常您将静态输入定义为checkboxGroupInput("columns", "Select the variables to plot", choices = vector_of_known_values)

但是根据您的问题,如果事先不知道数据集(例如:用户文件上传),则此方法无效。在这种情况下,在UI部分中使用uiOutputuiOutput("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)