【问题标题】:Adjust Shiny to show correct graphic调整闪亮以显示正确的图形
【发布时间】:2021-08-25 05:10:33
【问题描述】:

我有一个函数,它根据所选日期生成散点图。如您所见,我有三天 01/08、08/08 和 13/08。也就是说,存在三个不同的散点图。但是,在闪亮上我只能展示一个,它是从 01/08 开始的。

您能帮我调整一下代码,以便当它在日历上选择这三天中的某一天时,它会在闪亮上显示正确的散点图吗?

这个已解决的问题可能会有所帮助:Link Calendar with Scatter Plot in Shiny

可执行代码如下:

library(shiny)
library(shinythemes)
library(dplyr)
library(ggplot2)
library(tidyr)
library(lubridate)


function.cl<-function(){
  df <- structure(
    list(date = c("2021-08-01","2021-08-01","2021-08-01","2021-08-01","2021-08-01",
                  "2021-08-08","2021-08-08","2021-08-08","2021-08-08","2021-08-08","2021-08-08",
                  "2021-08-13","2021-08-13","2021-08-13","2021-08-13","2021-08-13"),
         Week= c("Sunday","Sunday","Sunday","Sunday","Sunday","Sunday","Sunday","Sunday",
                 "Sunday","Sunday","Sunday","Friday","Friday","Friday","Friday","Friday"),
         D1 = c(0,1,0,0,5,0,1,0,0,9,4,3,4,5,6,7), DR01 = c(2,1,0,0,3,0,1,0,1,7,2,3,4,6,7,8), 
         DR02 = c(2,0,0,0,4,2,1,0,1,4,2,3,4,5,6,7),  DR03 = c(2,0,0,2,6,2,0,0,1,5,2,2,4,5,7,5),
         DR04 = c(2,0,0,5,6,2,0,0,3,7,2,3,4,5,6,4),  DR05 = c(2,0,0,5,6,2,0,0,7,7,2,3,4,5,6,7), 
         DR06 = c(2,0,0,5,7,2,0,0,7,7,1,3,5,6,7,8),  DR07 = c(2,0,0,6,9,2,0,0,7,8,1,3,5,6,4,3)), 
    class = "data.frame", row.names = c(NA, -16L))
  
  
  scatter_date <- function(dt, dta = df) {
    dta %>%
      mutate(date = ymd(date)) %>%
      filter(date == ymd(dt)) %>%
      summarize(across(starts_with("DR"), sum)) %>%
      pivot_longer(everything(), names_pattern = "DR(.+)", values_to = "val") %>%
      mutate(name = as.numeric(name)) %>%
      plot(xlab = "Days", ylab = "Types", xlim = c(0, 7))
  }  
    Plot1<-scatter_date("2021-08-01")

    return(list(
      "Plot1" = Plot1, 
      date = df$date
    ))
}

ui <- fluidPage(
  
  ui <- shiny::navbarPage(theme = shinytheme("flatly"), collapsible = TRUE,
                          br(),
                          
                          tabPanel("",
                                   sidebarLayout(
                                     sidebarPanel(
                                       
                                       uiOutput("date"),
                                       br(),
                                     ),
                                     
                                     mainPanel(
                                       tabsetPanel(
                                         tabPanel("",plotOutput("Graph",width = "95%", height = "600"))),
                                     ))
                          )))


server <- function(input, output,session) {
  data <- reactive(function.cl())
  
  output$date <- renderUI({
    all_dates <- seq(as.Date('2021-01-01'), as.Date('2021-01-15'), by = "day")
    disabled <- as.Date(setdiff(all_dates, as.Date(data()$date)), origin = "1970-01-01")
    
    dateInput(input = "date", 
              label = "Select Date",
              min = min(data()$date),
              max = max(data()$date),
              value = max(data()$date),
              format = "dd-mm-yyyy",
              datesdisabled = disabled)
  })
  
  
  output$Graph <- renderPlot({
    function.cl()[["Plot1"]]
    
  })
  
  
}

shinyApp(ui = ui, server = server)

【问题讨论】:

    标签: r shiny


    【解决方案1】:

    试试这个

    library(shiny)
    library(shinythemes)
    library(dplyr)
    library(ggplot2)
    library(tidyr)
    library(lubridate)
    
    function.cl<-function(dt){
      df <- structure(
        list(date = c("2021-08-01","2021-08-01","2021-08-01","2021-08-01","2021-08-01",
                      "2021-08-08","2021-08-08","2021-08-08","2021-08-08","2021-08-08","2021-08-08",
                      "2021-08-13","2021-08-13","2021-08-13","2021-08-13","2021-08-13"),
             Week= c("Sunday","Sunday","Sunday","Sunday","Sunday","Sunday","Sunday","Sunday",
                     "Sunday","Sunday","Sunday","Friday","Friday","Friday","Friday","Friday"),
             D1 = c(0,1,0,0,5,0,1,0,0,9,4,3,4,5,6,7), DR01 = c(2,1,0,0,3,0,1,0,1,7,2,3,4,6,7,8), 
             DR02 = c(2,0,0,0,4,2,1,0,1,4,2,3,4,5,6,7),  DR03 = c(2,0,0,2,6,2,0,0,1,5,2,2,4,5,7,5),
             DR04 = c(2,0,0,5,6,2,0,0,3,7,2,3,4,5,6,4),  DR05 = c(2,0,0,5,6,2,0,0,7,7,2,3,4,5,6,7), 
             DR06 = c(2,0,0,5,7,2,0,0,7,7,1,3,5,6,7,8),  DR07 = c(2,0,0,6,9,2,0,0,7,8,1,3,5,6,4,3)), 
        class = "data.frame", row.names = c(NA, -16L))
      
      scatter_date <- function(dt, dta = df) {
        dta %>%
          mutate(date = ymd(date)) %>%
          filter(date == ymd(dt)) %>%
          summarize(across(starts_with("DR"), sum)) %>%
          pivot_longer(everything(), names_pattern = "DR(.+)", values_to = "val") %>%
          mutate(name = as.numeric(name)) %>%
          plot(xlab = "Days", ylab = "Types", xlim = c(0, 7))
      }  
      Plot1<-scatter_date(dt)
      
      return(list(
        "Plot1" = Plot1, 
        date = df$date
      ))
    }
    
    ui <- fluidPage(
      
      ui <- shiny::navbarPage(theme = shinytheme("flatly"), collapsible = TRUE,
                              br(),
                              
                              tabPanel("",
                                       sidebarLayout(
                                         sidebarPanel(
                                           
                                           uiOutput("date"),
                                           br(),
                                         ),
                                         
                                         mainPanel(
                                           tabsetPanel(
                                             tabPanel("",plotOutput("Graph",width = "95%", height = "600"))),
                                         ))
                              )))
    
    
    server <- function(input, output,session) {
      data <- reactive(function.cl("2021-08-01"))
      
      output$date <- renderUI({
        all_dates <- seq(as.Date('2021-01-01'), as.Date('2021-01-15'), by = "day")
        disabled <- as.Date(setdiff(all_dates, as.Date(data()$date)), origin = "1970-01-01")
        
        dateInput(input = "date", 
                  label = "Select Date",
                  min = min(data()$date),
                  max = max(data()$date),
                  value = max(data()$date),
                  format = "dd-mm-yyyy",
                  datesdisabled = disabled)
      })
      
      output$Graph <- renderPlot({
        req(input$date)
        function.cl(input$date)[["Plot1"]]
        
      })
      
    }
    
    shinyApp(ui = ui, server = server)
    

    【讨论】:

    • 谢谢YKS!一个问题:我的基础是 yyyy-mm-dd 格式,但如果它恰好是 dd-mm-yyyy 格式,你需要调整什么?我用最后一种格式测试过,但是报错了。
    • 你可以试试data$date &lt;- as.Date(data$date,format= "%d/%m/%y")。请查看不同的日期格式。
    • 感谢您的回复!但是您认为在哪里插入此代码?在函数上还是在服务器上?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多