当从 selectInput 中选择变量时,相关性不起作用,但在其他情况下运行得很好

Posted

技术标签:

【中文标题】当从 selectInput 中选择变量时,相关性不起作用,但在其他情况下运行得很好【英文标题】:Correlation doesn't work when variable is selected from selectInput but runs perfectly fine otherwise 【发布时间】:2021-07-08 09:27:38 【问题描述】:

我正在计算每个国家correlation,介于每日新冠病例数每日疫苗接种之间。

两个 df,一个用于确诊病例,另一个用于疫苗接种

library(tidyverse)
library(lubridate)
library(glue)
library(scales)
library(tidytext)
library(shiny)
library(shinydashboard)

file_url1 <- "https://raw.githubusercontent.com/johnsnow09/covid19-df_stack-code/main/ts_all_long4.csv"

file_url2 <- "https://raw.githubusercontent.com/johnsnow09/covid19-df_stack-code/main/vaccination_data.csv"

ts_all_long <- read.csv(url(file_url1))
vaccination_data <- read.csv(url(file_url2))

ts_all_long <- ts_all_long %>%
  mutate(date = as.Date(date))

vaccination_data <- vaccination_data %>%
  mutate(date = as.Date(date))

当我使用上述数据在rmarkdown运行相关性时,它会起作用:

ts_all_long %>% 
  left_join(y = vaccination_data,
            by = c("Country.Region" = "location", "date", "continent", "iso3c" = "iso_code")) %>% 
  
  na.omit() %>% 

  group_by(Country.Region) %>% 

  summarise(COR = cor(Confirmed_daily, total_vaccinations),
            total_vaccinations_per_hundred = first(total_vaccinations_per_hundred)) %>% 
  
  
  arrange(COR) %>% 
  na.omit() %>% 
  slice(c(1:15, ( n()-14): n() )) 

问题:当我在shinySelectInput total_vaccinations 中使用它来制作动态参数时,它会给出这个错误:

summarise() 输入 COR 存在问题。 [31mx[39m不兼容 尺寸 [34mi[39m 输入CORcor(Confirmed_daily, as.numeric(input$id_vaccination_type))。 [34mi[39m 错误 发生在第 2 组:Country.Region = "Argentina"。

用户界面

fluidRow(
                 style = "border: 1px solid gray;",
                 h3("Vaccination to Cases Correlation Analysis"),
                 
                 column(4, style = "border: 1px solid gray;",
                        selectInput(inputId = "id_vaccination_type", label = "Choose Vaccination Parameter", 
                                    choices = c("total_vaccinations","people_vaccinated","people_fully_vaccinated"), 
                                    selected = "total_vaccinations")
                        ),
                 
                 column(8, style = "border: 1px solid gray;",
                        plotOutput("top_corr_countries", height = "550px") #
                 )

服务器

corr_data <- reactive(
        
        corr_data <- ts_all_long %>% 
            left_join(y = vaccination_data,
                      by = c("Country.Region" = "location", "date", "continent", "iso3c" = "iso_code")) %>% 
            
            na.omit() %>% 
            
            group_by(Country.Region) %>% 
            
            summarise(COR = cor(Confirmed_daily, as.numeric(input$id_vaccination_type)) ,
                      total_vaccinations_per_hundred = first(total_vaccinations_per_hundred)) %>% 
            na.omit() %>% 
            arrange(COR) %>% 
            na.omit() %>% 
            slice(c(1:15, ( n()-14): n() ))
    )

output$top_corr_countries <- renderPlot(
        
        corr_data() %>% 
            
            ggplot(aes(x = COR , 
                       y = fct_reorder(Country.Region, -COR),
                       col = COR > 0))  +
            geom_point(aes(size = total_vaccinations_per_hundred)) +
            geom_errorbarh(height = 0, size = 1, aes(xmin = COR, xmax = 0)) +
            geom_vline(xintercept = 0, col = "midnightblue", lty = 2, size = 1) +
            
            theme(
                panel.grid.major = element_blank(),
                legend.position = "NULL") +
            
            labs(title = glue("Top Countries by +/- Correlation with Vaccination as of max(vaccination_data$date)"),
                 subtitle = "Size is proportional to Vaccination per Population",
                 y = "", x = "Correlation",
                 caption = "Data source: covid19.analytics
       Created by: ViSa")
        
    )

注意:我也在另一个链接中发布了这个问题,但那里听起来更复杂,所以我试图在这个链接中重新表述它以使其更简单。

其他帖子:Unable to renderPlot on adding a selectInput option for variable in shiny which runs perfectly fine otherwise

【问题讨论】:

【参考方案1】:

input$id_vaccination_type 是您要选择的变量的字符串。

要实际选择该变量的值,您可以将变量名称转换为 symbol 并对其进行评估,例如使用 bang-bang 运算符 !!

所以一种解决方案是:

cor(Confirmed_daily, as.numeric(!! sym(input$id_vaccination_type))

我不确定这是否会使您的应用正常运行(我无法在 github 上下载 csv 文件,并且希望以 dput 为例),但它应该可以解决这个特定问题。

这个问题还有其他解决方案。一种是使用get 而不是!! sym(input))。另一种是使用varSelectInput,它返回实际名称而不是字符串(所以这里首先应该不会出现问题)。

【讨论】:

谢谢@TimTeaFan,真的很感谢你的帮助!!。我是闪亮的新手,现在已经在这个问题上停留了一段时间。

以上是关于当从 selectInput 中选择变量时,相关性不起作用,但在其他情况下运行得很好的主要内容,如果未能解决你的问题,请参考以下文章

如何在正确位置使用 SelectInput 时保存在 DT 中所做的编辑

使用 R Shiny 进行多重线性回归 (SelectInput --> multiple=TRUE)

从 selectInput 到 facet_wrap 的多个变量:R Shiny

未选择值时如何更改 R Shiny 'selectInput' 值选择显示空间背景颜色?

当我有选择 > 1000 时,Shiny 不会向我显示整个 selectInput

根据 R Shiny 中的其他选择动态更新两个 selectInput 框