【问题标题】:Values inside `valueBox` do not change when the date range changes日期范围更改时,`valueBox` 中的值不会更改
【发布时间】:2020-05-19 17:17:37
【问题描述】:

当日期范围更改时,我已经能够使用tidyverse 更改数据框中的值,但值框中的汇总值没有更改。

df <- data.frame("Ship Date" = c("2020-01-01", "2020-01-02", "2020-01-03", "2020-01-04"),
                 "Revenue" = c(100, 200, 300, 400), "Load Volume" = c(10, 12, 14, 18))

ui <- fluidPage(
  dateRangeInput(
    inputId = "daterange",
    label = "Select the date range",
    start = min(df$`Ship Date`),
    end = max(df$`Ship Date`),
    min = min(df$`Ship Date`),
    max = max(df$`Ship Date`),
    format = "yyyy/mm/dd",
   separator = "-" 
  ),
  textOutput("startdate"),
  textOutput("enddate"),
  textOutput("range"),
dashboardbody(
  fluidRow(box(valueBoxOutput("totalrevenue"), title = "Revenue")
  ,box(valueBoxOutput("revperload"), title = "Revenue Per Load")
))

server <- function(input, output, session) ({
 total.revenue <- dollar(sum(df$Revenue)
 rev.perload <- dollar(sum(df$Revenue) / sum(df$`Load Volume`))
# date range
output$startdate <- renderText({
    as.character(input$daterange[1])
  })
  output$enddate <- renderText({
    as.character(input$daterange[2])
  })
  output$range <- renderText({
    paste("Selected date range is ", input$daterange[1], "to", input$daterange[2])
  })
output$totalrevenue <- renderValueBox({
    total.revenue = subset(df, df$`Ship Date` >= input$daterange[1] & df$`Ship Date`<=input$daterange[2])
    valueBox(
      formatC(total.revenue, format = "d", big.mark = ',')
      ,paste(NULL)
    )
  })
output$revperload <- rendervalueBox({
    rev.perload = subset(df, df$`Ship Date` >= input$daterange[1] & df$`Ship Date` <= input$daterange[2])
    valueBox(
      formatC(total.revenue, format = "d", big.mark = ',')
      ,paste(NULL)
    )
   })
})

shinyApp(ui, server)

当仪表板中的日期范围发生变化时,两个值框没有反应。

【问题讨论】:

  • 有很多代码拼写错误导致它无法运行。您缺少一些括号,rendervalueBox 应该是 renderValueBox 等。

标签: r shiny dplyr shinydashboard


【解决方案1】:

见下文:

df <- data.frame("Ship Date" = c("2020-01-01", "2020-01-02", "2020-01-03", "2020-01-04"),
                 "Revenue" = c(100, 200, 300, 400), "Load Volume" = c(10, 12, 14, 18), stringsAsFactors = FALSE)

ui <- fluidPage(
  titlePanel("StackOverFlow Example"),

  sidebarLayout(

    sidebarPanel(
      dateRangeInput(
        inputId = "daterange",
        label = "Select the date range",
        start = min(df$Ship.Date),
        end = max(df$Ship.Date),
        min = min(df$Ship.Date),
        max = max(df$Ship.Date),
        format = "yyyy/mm/dd",
        separator = "-" 
      ),
      textOutput("startdate"),
      textOutput("enddate"),
      textOutput("range")
    ),

    mainPanel(
      box(
        title = "Revenue",
        valueBoxOutput("totalrevenue")
      ),
      box(
        title = "Revenue Per Load",
        valueBoxOutput("revperload")
      )
    )
  )
)

server <- function(input, output, session) ({

  # date range
  output$startdate <- renderText({as.character(input$daterange[1])})

  output$enddate <- renderText({as.character(input$daterange[2])})

  output$range <- renderText({paste("Selected date range is ", input$daterange[1], "to", input$daterange[2])})


  #KPI Boxes
  output$totalrevenue <- renderValueBox({

    temp <- df[df$Ship.Date >= input$daterange[1] & df$Ship.Date <= input$daterange[2],]

    total.revenue <- dollar(sum(temp$Revenue))

    valueBox(
      formatC(total.revenue, format = "d", big.mark = ',')
      ,paste(NULL)
    )
  })

  output$revperload <- renderValueBox({

    temp <- df[df$Ship.Date >= input$daterange[1] & df$Ship.Date <= input$daterange[2],]

    rev.perload <- dollar(sum(temp$Revenue) / sum(temp$Load.Volume))

    valueBox(
      formatC(rev.perload, format = "d", big.mark = ',')
      ,paste(NULL)
    )
  })
})

shinyApp(ui, server)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-29
    • 1970-01-01
    • 2022-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多