【问题标题】:How to tweak table generation in Shiny如何在 Shiny 中调整表格生成
【发布时间】:2021-11-03 15:00:05
【问题描述】:

你能帮我调整下面闪亮的代码吗?第一个代码只是显示我从Test 数据库中得到的平均值。你可以看到我只有星期五的平均值,如果我选择在daterange 中查看直到星期五的一天,我想在 Shiny 中呈现这些平均值,但它运行得不是很好。仅当我将其放在 01/11 到 05/11 的 daterange 中时它才有效,但如果我选择 02/11 到 05/11,例如,它不起作用。此外,如果我输入 01/11 到 02/11,它会显示平均值,但是,它不必显示,因为这些日期都不是星期五。我插入了三张图片供您查看。如何在代码中进行调整?

第一个代码

library(dplyr)

   Test <- structure(list(date1 = as.Date(c("2021-11-01","2021-11-01","2021-11-01","2021-11-01")),
                           date2 = as.Date(c("2021-10-22","2021-10-22","2021-10-29","2021-10-29")), 
                           Week = c("Friday", "Friday", "Friday", "Friday"),
                           Category = c("FDE", "ABC", "FDE", "ABC"), 
                           time = c(4, 6, 6, 3)), class = "data.frame",row.names = c(NA, -4L))
  meanTest<-Test%>%
      group_by(Week,Category)%>%
      summarize(mean(time))
    > meanTest

  Week   Category    `mean(time)`
1 Friday ABC               4.5
2 Friday FDE               5

第二个代码

library(shiny)
library(shinythemes)
library(dplyr)

Test <- structure(list(date1 = as.Date(c("2021-11-01","2021-11-01","2021-11-01","2021-11-01")),
                       date2 = as.Date(c("2021-10-22","2021-10-22","2021-10-29","2021-10-29")), 
                       Week = c("Friday", "Friday", "Friday", "Friday"),
                       Category = c("FDE", "ABC", "FDE", "ABC"), 
                       time = c(4, 6, 6, 3)), class = "data.frame",row.names = c(NA, -4L))
ui <- fluidPage(
  
  shiny::navbarPage(theme = shinytheme("flatly"), collapsible = TRUE,
                    br(),
                    tabPanel("",
                             sidebarLayout(
                               sidebarPanel(
                                 uiOutput('daterange')
                               ),
                               mainPanel(
                                 dataTableOutput('table')
                                 
                               )
                             ))
  ))

server <- function(input, output,session) {
  
  data <- reactive(Test)
  
  output$daterange <- renderUI({
    dateRangeInput("daterange1", "Period you want to see:",
                   min   = min(data()$date1))
  })
  
  
  
  data_subset <- reactive({
    req(input$daterange1)
    req(input$daterange1[1] <= input$daterange1[2])
    days <- seq(input$daterange1[1], input$daterange1[2], by = 'day')
    Test <- filter(data(),
                   date1 %in% days | 
                     date2 %in% days)
    
    meanTest<-Test%>%
      group_by(Week,Category)%>%
      summarize(mean(time))
    
  })
  
  
  output$table <- renderDataTable({
    data_subset()
  })
  
}

shinyApp(ui = ui, server = server)

01/11 至 05/11 有效

02/11 到 05/11 无效。

01/11 到 02/11 它显示平均值,但是,它不必显示

【问题讨论】:

    标签: r shiny


    【解决方案1】:

    试试这个

    library(shiny)
    library(shinythemes)
    library(dplyr)
    
    Test <- structure(list(date1 = as.Date(c("2021-11-01","2021-11-01","2021-11-01","2021-11-01")),
                           date2 = as.Date(c("2021-10-22","2021-10-22","2021-10-29","2021-10-29")),
                           Week = c("Friday", "Friday", "Friday", "Friday"),
                           Category = c("FDE", "ABC", "FDE", "ABC"),
                           time = c(4, 6, 6, 3)), class = "data.frame",row.names = c(NA, -4L))
    
    ui <- fluidPage(
    
      shiny::navbarPage(theme = shinytheme("flatly"), collapsible = TRUE,
                        br(),
                        tabPanel("",
                                 sidebarLayout(
                                   sidebarPanel(
                                     uiOutput('daterange')
                                   ),
                                   mainPanel(
                                     dataTableOutput('table')
    
                                   )
                                 ))
      ))
    
    server <- function(input, output,session) {
    
      data <- reactive(Test)
    
      output$daterange <- renderUI({
        dateRangeInput("daterange1", "Period you want to see:",
                       min   = min(data()$date1))
      })
    
      observe({updateDateRangeInput(session,"daterange1",start = NA, end = NA)})
      
      wk_port2eng <- data.frame(
        WeekE = c("Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"),
        WeekP = c("segunda-feira", "terca-feira", "quarta-feira", "quinta-feira",  "sexta-feira", "sabado", "domingo")
      )
      
      data_subset <- reactive({
        req(input$daterange1)
        req(input$daterange1[1] <= input$daterange1[2])
        days <- seq(input$daterange1[1], input$daterange1[2], by = 'day')
    
        Test1 <- dplyr::filter(data(), date1 %in% days)
        weeks_inp <- unique(weekdays(days))  
        wk <- wk_port2eng[wk_port2eng$WeekP %in% weeks_inp,]  ###  if weekday is in Portuguese in your notebook
        #wk <- wk_port2eng[wk_port2eng$WeekE %in% weeks_inp,]  ###  if weekday is in English in your notebook
        weeks_ine <- wk$WeekE
        print(weeks_ine)
        
        meanTest1 <- data() %>%
          group_by(Week,Category) %>%
          dplyr::summarize(mean(time))
        meanTest <- meanTest1[meanTest1$Week %in% as.character(weeks_ine),]
        meanTest
      })
    
      output$table <- renderDataTable({
        data_subset()
      })
    
    }
    
    shinyApp(ui = ui, server = server)
    

    【讨论】:

    • 谢谢。 date1 是我日历上的一个限制日期,所以当你运行 APP 时,它只显示 01/11 之后的天数。 date2 只是指信息被重新提交的日期,它们总是date1 之前的日期。关于日历,看到只有 01/11 之后的日期(date1),所以我希望代码能够识别日历中选择的星期几,所以如果我选择检查直到 05/11 (星期五),将显示带有平均值的表格,如果是 04/11(星期四),则不会。不知道是不是更清楚了?
    • 我不明白您的回复,但我们的想法是生成仅包含date1 之后日期的平均值的表格。例如,如果我选择从 02/11 到 04/11 进行查看,则不会显示该表格,因为在该时间间隔内没有星期五。但是,如果您选择 02/11 到 05/11,它将显示表格,因为 05/11 是星期五。
    • 安东尼奥,请尝试更新后的代码,
    • 我测试了@YBS,它对你有用吗?例如,我对 02/11 到 05/11 进行了测试,但没有显示任何结果。
    • 它对我有用。我会放一张图片。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-04
    • 1970-01-01
    • 2014-05-11
    • 1970-01-01
    • 1970-01-01
    • 2021-11-23
    相关资源
    最近更新 更多