闪亮的checkboxGroupInput ggplots作为列表

时间:2018-07-09 01:45:37

标签: r ggplot2 shiny

任何人都可以建议我从列表中提取不同ggplots的闪亮的checkboxgroupoinput选项的方法,例如geom_bar(),geom_line()。我尝试了以下简化的代码,它仅显示最后一个图:谢谢您的帮助。

 library(shiny)
  library(ggplot2)
  library(easyGgplot2)
  patient <- cbind.data.frame(seq(1:14),matrix(sample(1:100, 84), ncol=6))
 colnames(patient) <- c('DAYS', 'PHYSICAL_ACTIVITY', 'SMOKING','ALCOHOL_INTAKE', 'HYDRATION', 'SLEEP', 'Total_score')
    ui <- fluidPage(
                titlePanel("Data Plot"),
                        sidebarLayout(
                                sidebarPanel(
                        fluidRow(column(6, 
                                    checkboxGroupInput("checkGroup", 
                                      ("Parameters"), 
                                    list("PHYSICAL ACTIVITY" = 1, 
                                       "SLEEP" = 2, 
                                      "ALCOHOL INTAKE" = 3,
                                      "SELECT ALL" = 4
                                        )))
                                      ),
                       fluidRow(column(10, actionButton("goButton", label = "Analysis Report"))
                                            )
                                          ), #Sidebarpanel
                                                    mainPanel(
                                                        plotOutput("plot1", height='800px')

                                        )#Mainpanel
                      ) #Sidebar layout
        )#fluidpage

 server <- function(input, output) {
 output$plot1 <- renderPlot({ 
 input$goButton
  p1 <- reactive({
    if(!(1 %in% input$checkGroup)) return(NULL)
      ggplot(data=patient, aes(x=DAYS, y=PHYSICAL_ACTIVITY))+geom_bar(stat="identity", aes(fill=PHYSICAL_ACTIVITY<=median(PHYSICAL_ACTIVITY)), show.legend=F)+scale_fill_manual(values = c('steelblue', 'red') )+labs(title = 'PHYSICAL ACTIVITY (STEPS)', x = NULL, y = NULL)+theme_minimal()
   })
  # Second plot
  p2 <- reactive ({
      if(!(2 %in% input$checkGroup )) return(NULL)
      p2 <- ggplot(data=patient, aes(x=DAYS,y=SLEEP))+geom_line(colour='black', size=1)+geom_point(size=3, aes(colour=cut(SLEEP,c(-Inf,summary(SLEEP)[[2]],summary(SLEEP)[[5]],Inf))), show.legend=F)+scale_color_manual(values = c("red", "orange","green"))+labs(title = 'SLEEP (hrs)', x = NULL, y = NULL) +theme_minimal() 
  })
  ptlist <- list(p1(),p2())
  ggplot2.multiplot(ptlist, cols=1)
 })
 }
shinyApp(ui, server)

3 个答案:

答案 0 :(得分:0)

如果将ggplot2.multiplot(ptlist, cols=1)替换为do.call(ggplot2.multiplot, c(ptlist, cols=1)),它将起作用

但是用ggplot函数来完成此操作不是实现目标的好方法。 您可以尝试这样的事情

library(shiny)
library(ggplot2)
library(easyGgplot2)

patient <- cbind.data.frame(
    seq(1:14), 
    matrix(
        sample(1:100, 84), 
        ncol = 6
    )
)

colnames(patient) <- c(
    'DAYS',
    'PHYSICAL_ACTIVITY',
    'SMOKING',
    'ALCOHOL_INTAKE',
    'HYDRATION',
    'SLEEP',
    'Total_score'
)

ui <- fluidPage(
    titlePanel("Data Plot"),
    sidebarLayout(
        sidebarPanel(
            fluidRow(
                column(6,
                       checkboxGroupInput(
                           "checkGroup",
                           "Parameters",
                           list(
                               "PHYSICAL ACTIVITY",
                               "SLEEP"),
                           selected = "PHYSICAL ACTIVITY")
                       )
                )
            ),
        mainPanel(
            plotOutput("plots")
        )
    )
)

server <- function(input, output) {

    plot_one <- ggplot(data = patient, aes(x = DAYS, y = PHYSICAL_ACTIVITY)) + 
        geom_bar(
            stat = "identity",
            aes(fill = PHYSICAL_ACTIVITY <= median(PHYSICAL_ACTIVITY)),
            show.legend = F) + 
        scale_fill_manual(
            values = c('steelblue', 'red')) + 
        labs(title = 'PHYSICAL ACTIVITY (STEPS)',
             x = NULL,
             y = NULL) + 
        theme_minimal()

    plot_two <- ggplot(data = patient, aes(x = DAYS, y = SLEEP)) + 
        geom_line(colour = 'black', size = 1) + 
        geom_point(size = 3, 
                   aes(colour = cut(SLEEP, 
                                    c(-Inf, 
                                      summary(SLEEP)[[2]], 
                                      summary(SLEEP)[[5]], 
                                      Inf)
                                )
                   ),
                   show.legend = F) + 
        scale_color_manual(values = c("red", "orange", "green")) + 
        labs(title = 'SLEEP (hrs)', 
             x = NULL,
             y = NULL) + 
        theme_minimal()

    list.of.plots <- list(
        `PHYSICAL ACTIVITY` = plot_one,
        `SLEEP` = plot_two
    )

    output$plots <- renderPlot(
        do.call(ggplot2.multiplot, c(list.of.plots[input$checkGroup], cols=1))
    )

}
shinyApp(ui, server)

答案 1 :(得分:0)

        library(shiny)
        library(ggplot2)
        library(easyGgplot2)
        patient <- cbind.data.frame(
          seq(1:14), 
          matrix(
            sample(1:100, 84), 
            ncol = 6
          )
        )
        colnames(patient) <- c(
          'DAYS',
          'PHYSICAL_ACTIVITY',
          'SMOKING',
          'ALCOHOL_INTAKE',
          'HYDRATION',
          'SLEEP',
          'Total_score'
        )
        write.csv(patient, file="patient.csv")
        ui <- fluidPage(
          titlePanel("Data Plot"),
          sidebarLayout(
            sidebarPanel(
              fluidRow(
                column(6,
                       checkboxGroupInput(
                         "checkGroup",
                         "Parameters",
                         list(
                           "PHYSICAL ACTIVITY",
                           "SLEEP"),
                         selected = "PHYSICAL ACTIVITY")
                )
              ),
              fluidRow(
                fileInput("file1", "Choose Data sheet",
                          multiple = TRUE,
                          accept = c("text/csv",
                                     "text/comma-separated-values,text/plain",
                                     ".csv"))
              )
            ),
            mainPanel(
              plotOutput("plots")
            )
          )
        )
        server <- function(input, output) {
          patient <- reactive({
            req(input$file1)
            read.csv(input$file1$datapath,
                     header = T
                     )   
          })
          plot_one <- ggplot(data = patient(), aes(x = DAYS, y = PHYSICAL_ACTIVITY)) + 
            geom_bar(
              stat = "identity",
              aes(fill = PHYSICAL_ACTIVITY <= median(PHYSICAL_ACTIVITY)),
              show.legend = F) + 
            scale_fill_manual(
              values = c('steelblue', 'red')) + 
            labs(title = 'PHYSICAL ACTIVITY (STEPS)',
                 x = NULL,
                 y = NULL) + 
            theme_minimal()
          plot_two <- ggplot(data = patient(), aes(x = DAYS, y = SLEEP)) + 
            geom_line(colour = 'black', size = 1) + 
            geom_point(size = 3, 
                       aes(colour = cut(SLEEP, 
                                        c(-Inf, 
                                          summary(SLEEP)[[2]], 
                                          summary(SLEEP)[[5]], 
                                          Inf)
                       )
                       ),
                       show.legend = F) + 
            scale_color_manual(values = c("red", "orange", "green")) + 
            labs(title = 'SLEEP (hrs)', 
                 x = NULL,
                 y = NULL) + 
            theme_minimal()
        list.of.plots <- list(
            `PHYSICAL ACTIVITY` = plot_one,
            `SLEEP` = plot_two
          )
        output$plots <- renderPlot(
            do.call(ggplot2.multiplot, c(list.of.plots[input$checkGroup], cols=1))
          )
        }
        shinyApp(ui, server)

答案 2 :(得分:0)

阅读csv的示例。

library(shiny)
library(ggplot2)
library(easyGgplot2)
patient <- cbind.data.frame(
    seq(1:14), 
    matrix(
        sample(1:100, 84), 
        ncol = 6
    )
)
colnames(patient) <- c(
    'DAYS',
    'PHYSICAL_ACTIVITY',
    'SMOKING',
    'ALCOHOL_INTAKE',
    'HYDRATION',
    'SLEEP',
    'Total_score'
)
write.csv(patient, file="patient.csv")
ui <- fluidPage(
    titlePanel("Data Plot"),
    sidebarLayout(
        sidebarPanel(
            fluidRow(
                column(6,
                       checkboxGroupInput(
                           "checkGroup",
                           "Parameters",
                           list(
                               "PHYSICAL ACTIVITY",
                               "SLEEP"),
                           selected = "PHYSICAL ACTIVITY")
                )
            ),
            fluidRow(
                fileInput("file1", "Choose Data sheet",
                          multiple = TRUE,
                          accept = c("text/csv",
                                     "text/comma-separated-values,text/plain",
                                     ".csv"))
            )
        ),
        mainPanel(
            plotOutput("plots")
        )
    )
)
server <- function(input, output) {
    patient <- reactive({
        req(input$file1)
        read.csv(input$file1$datapath,
                 header = T
        )   
    })
    plot_one <- function(patient.data) {
        ggplot(patient.data, aes(x = DAYS, y = PHYSICAL_ACTIVITY)) + 
            geom_bar(
                stat = "identity",
                aes(fill = PHYSICAL_ACTIVITY <= median(PHYSICAL_ACTIVITY)),
                show.legend = F) + 
            scale_fill_manual(
                values = c('steelblue', 'red')) + 
            labs(title = 'PHYSICAL ACTIVITY (STEPS)',
                 x = NULL,
                 y = NULL) + 
            theme_minimal()
    }
    plot_two <- function(patient.data){
        ggplot(patient.data, aes(x = DAYS, y = SLEEP)) + 
            geom_line(colour = 'black', size = 1) + 
            geom_point(size = 3, 
                       aes(colour = cut(SLEEP, 
                                        c(-Inf, 
                                          summary(SLEEP)[[2]], 
                                          summary(SLEEP)[[5]], 
                                          Inf)
                       )
                       ),
                       show.legend = F) + 
            scale_color_manual(values = c("red", "orange", "green")) + 
            labs(title = 'SLEEP (hrs)', 
                 x = NULL,
                 y = NULL) + 
            theme_minimal()
    }
    output$plots <- renderPlot({
        list.of.plots <- list(
            `PHYSICAL ACTIVITY` = plot_one(patient()),
            `SLEEP` = plot_two(patient())
        )

        do.call(ggplot2.multiplot, c(list.of.plots[input$checkGroup], cols=1))
    })
}
shinyApp(ui, server)
相关问题