代码之家  ›  专栏  ›  技术社区  ›  ViSa

如何在r shing中根据切换复选框更改图表?

  •  0
  • ViSa  · 技术社区  · 5 年前

    我是新手 shiny 并试图 基于切换开关输入更改图表变量 但会出错。

    我用过 toggleid 里面 observe({}) 但不确定是否就是这样做的。

    根据条件,我已将所需的变量名存储在 Case_selected 我试着用它 !!Case_selected 从中获取变量名。

    ui代码:

    fluidRow(
                     style = "border: 1px solid gray;",
                     h3("Top Countries with Confirmed Cases"),
                     
                     column(3, style = "border: 1px solid gray;",
                            materialSwitch(
                                inputId = "id_switch_confirmedtotal",
                                label = "Death Cases",
                                value = FALSE, 
                                status = "danger"
                            ),
                         plotOutput("top_confirmed_total", height = "650px")),
                     column(3, style = "border: 1px solid gray;",
                            materialSwitch(
                                inputId = "id_switch_confirmeddaily",
                                label = "Death Cases",
                                value = FALSE, 
                                status = "danger"
                            ),
                            plotOutput("top_confirmed_daily", height = "650px")),
                     column(6, 
                            h4("Latest 1 week Top Countries by Daily Confirmed Cases"),
                            plotOutput("lastweek_confirmed_daily", height = "650px")
                     )
                     
                 ),
    

    服务器代码:

    observe({
            x <- input$id_switch_confirmedtotal
            
            # condition tested
            if (is.null(x))
                Case_selected <- "Confirmed"
            else
                Case_selected <- "Death"
        })
        
        output$top_confirmed_total <- renderPlot({
            
            ts_all_long %>% 
                filter(date == max(date, na.rm = TRUE)) %>% 
                slice_max(order_by = !! Case_selected, n = 10) %>% # Confirmed
                ggplot(aes( x = !! Case_selected, y =  reorder(Country.Region, !! Case_selected), 
                            fill = Country.Region))  +
                geom_col(show.legend = FALSE) +
                scale_x_continuous(label = unit_format(scale = 1e-6, unit = "M")) +
                #scale_fill_tableau(palette = "Tableau 20")  
        })
    

    错误:找不到对象“Case_selected”

    我也试过 !! rlang::sym() 但不确定为什么这些都不起作用。

        output$top_confirmed_total <- renderPlot({
            
            ts_all_long %>% 
                filter(date == max(date, na.rm = TRUE)) %>% 
                slice_max(order_by = !! rlang::sym(Case_selected) , n = 10) %>% # Confirmed
                ggplot(aes( x = !! rlang::sym(Case_selected), y =  reorder(Country.Region, !! rlang::sym(Case_selected)), 
                            fill = Country.Region))  +
                geom_col(show.legend = FALSE) +
                scale_x_continuous(label = unit_format(scale = 1e-6, unit = "M")) +
                scale_fill_tableau(palette = "Tableau 20") +
                labs(title = "Top10 TotalConfirmed Countries",
                     subtitle = glue("as of {max(ts_all_long$date)}"),
                     y = "", x = "Total Confirmed Cases",
                     caption = "Data source: covid19.analytics
           Created by: ViSa") 
        })
    

    不使用任何变量切换选项即可工作的原始代码:

    output$top_confirmed_total <- renderPlot({
            
            ts_all_long %>% 
                filter(date == max(date, na.rm = TRUE)) %>% 
                slice_max(order_by = Confirmed, n = 10) %>% 
                ggplot(aes( x = Confirmed, y =  reorder(Country.Region, Confirmed), 
                            fill = Country.Region))  +
                geom_col(show.legend = FALSE) +
                scale_x_continuous(label = unit_format(scale = 1e-6, unit = "M")) +
                #scale_fill_tableau(palette = "Tableau 20") 
        })
    

    更新 ts_all_long

    enter image description here

    更新 对于可复制的示例:

    library(tidyverse)
    library(lubridate)
    
    file_url1 <- "https://raw.githubusercontent.com/johnsnow09/covid19-df_stack-code/main/ts_all_long4.csv"
    
    ts_all_long <- read.csv(url(file_url1))
    
    ts_all_long <- ts_all_long %>%
      mutate(date = as.Date(date))
    

    ui。R

    library(shiny)
    library(shinydashboard)
    library(shinythemes)
    library(shinyWidgets)
    library(highcharter)
    
    shinyUI(fluidPage(
        theme=shinytheme("lumen"),
        themeSelector(),
        
        navbarPage(
           title = "Covid19 Dashboard", 
            id = "Covid19_Dashboard",
           
           tabPanel("By Confirmed Cases",
                 
                 # Application title
                 titlePanel("Global level"),
                 
                 # fluidRow(h5("(this Page may take some time, kindly wait to load!!)", 
                 #             col = "gray30", align = "center")),
                 
                 
                 fluidRow(
                     style = "border: 1px solid gray;",
                     h3("Top Countries with Confirmed Cases"),
                     
                     column(3, style = "border: 1px solid gray;",
                            materialSwitch(
                                inputId = "id_switch_confirmedtotal",
                                label = "Death Cases",
                                value = FALSE, 
                                status = "danger"
                                          ),
                         plotOutput("top_confirmed_total", height = "650px")
                            )
                     )
                     
                 
    )))
    

    服务器。R

    library(shiny)
    library(tidyverse)
    library(ggthemes)
    library(covid19.analytics)
    library(tidytext)
    library(scales)
    library(lubridate)
    library(glue)
    library(highcharter)
    library(shinyWidgets)
    
    shinyServer(function(input, output) {
    
    observe({
            x <- input$id_switch_confirmedtotal
            
            # condition tested
            if (is.null(x))
                Case_selected <- "Confirmed"
            else
                Case_selected <- "Death"
        })
        
        output$top_confirmed_total <- renderPlot({
            
            ts_all_long %>% 
                filter(date == max(date, na.rm = TRUE)) %>% 
                slice_max(order_by = .data[[Case_selected]], n = 10) %>% # Confirmed
                ggplot(aes( x = .data[[Case_selected]], 
                            y =  reorder(Country.Region, .data[[Case_selected]]), 
                            fill = Country.Region))  +
                geom_col(show.legend = FALSE) +
                scale_x_continuous(label = unit_format(scale = 1e-6, unit = "M")) +
                scale_fill_tableau(palette = "Tableau 20") +
                labs(title = "Top10 TotalConfirmed Countries",
                     subtitle = glue("as of {max(ts_all_long$date)}"),
                     y = "", x = "Total Confirmed Cases",
                     caption = "Data source: covid19.analytics
           Created by: ViSa") 
        })
    })
    
    
    1 回复  |  直到 5 年前
        1
  •  0
  •   Ronak Shah    5 年前

    你需要定义 Case_selected 作为反应式的,这样你就可以在整个应用程序中使用它。也使用 .data 以引用列名。

    shinyServer(function(input, output) {
      rv <- reactiveValues()
      
      observe({
        x <- input$id_switch_confirmedtotal
        # condition tested
        if (!x) rv$Case_selected <- "Confirmed"
        else rv$Case_selected <- "Death"
      })
      
      output$top_confirmed_total <- renderPlot({
        
        ts_all_long %>% 
          filter(date == max(date, na.rm = TRUE)) %>% 
          slice_max(order_by = .data[[rv$Case_selected]], n = 10) %>% # Confirmed
          ggplot(aes( x = .data[[rv$Case_selected]], 
                      y =  reorder(Country.Region, .data[[rv$Case_selected]]), 
                      fill = Country.Region))  +
          geom_col(show.legend = FALSE) +
          scale_x_continuous(label = unit_format(scale = 1e-6, unit = "M")) +
          scale_fill_tableau(palette = "Tableau 20") +
          labs(title = "Top10 TotalConfirmed Countries",
               subtitle = glue("as of {max(ts_all_long$date)}"),
               y = "", x = "Total Confirmed Cases",
               caption = "Data source: covid19.analytics
           Created by: ViSa") 
      })
    })
    
    推荐文章