首页 > 解决方案 > RShiny - 警告:错误:美学必须是长度 1 或与数据相同 (48):y

问题描述

我试图让我的输入函数链接到我的脚本,但我不断收到错误消息。我正在尝试添加一个复选框选项来过滤我在图中的数据。

我曾尝试在我的脚本 ( input$rating) 中的许多不同位置放置输入函数,但我不断收到类似的错误。我到处寻找,但似乎找不到解决此问题的通用答案。

ui <- fluidPage("Retired Risks by Retired Date",
                checkboxGroupInput(inputId = "rating", label = "Risk Rating", 
                                   choices = c("Critical","Major","Moderate","Minor")),
                plotOutput("plot1"))

server <- function(input, output){
  Risk <- read.csv("C:/Users/ABakk1/Desktop/RShinyTest.csv")
  df <- data.frame(Risk$Risk_Retired_Date, Risk$Risk_Rating)
  dfsum <- df %>%
    group_by(Risk.Risk_Retired_Date, Risk.Risk_Rating) %>%
    tally()
  dfsum$Risk.Risk_Retired_Date <- factor(dfsum$Risk.Risk_Retired_Date, 
                                         levels=c("18-Jan","18-Feb","18-Mar","18-Apr",
                                                  "18-May","18-Jun","18-Jul","18-Aug",
                                                  "18-Sep","18-Oct","18-Nov","18-Dec",
                                                  "19-Jan","19-Feb"))

  output$plot1 <- renderPlot({
    print(ggplot(dfsum, aes(x = Risk.Risk_Retired_Date, 
                            y = n<input$rating, colour = Risk.Risk_Rating ))) + 
    geom_line(aes(group = Risk.Risk_Rating), size = 1.5) + 
    scale_color_manual(name = "Risk Rating", 
                       labels = c("Critical", "Major", "Minor", "Moderate"),
          values = c("Critical"="darkred", "Major"="orangered", 
                     "Moderate"="darkorange", "Minor"="darkgoldenrod1")) + 
    scale_y_continuous(limits = c(0,35)) +
    theme_bw() +
    theme(panel.grid.major = element_blank(), 
          legend.key=element_blank(), legend.justification = c(0,1),
          legend.position = c(0.05,0.95), 
          legend.box.background = element_rect(colour = "black"), 
          text=element_text(size=14,  family="Arial Narrow")) +
    labs(title = "Retired Risks by Date", 
         y = "Number Risks Closed", x = "Risk Retired Date") +
    guides(color=guide_legend(override.aes=list(fill=NA)))})
}

shinyApp(ui, server)

这就是我的图应该是这样的:折线图

我只想添加过滤器选项。

据我所知,我认为我没有将其放置input$rating在正确的位置,但我已经看到许多不同的脚本将其放置在不同的位置。这是一个容易解决的问题吗?

标签: rggplot2shiny

解决方案


存储在 input$rating 中的值是来自以下一项或多项的字符向量:c("Critical","Major","Moderate","Minor").

在 renderPlot 函数中的 ggplot 调用中,您正在评估 input$rating ,就好像它是一个数字:

print(ggplot(dfsum, aes(x = Risk.Risk_Retired_Date, 
                            y = n<input$rating, colour = Risk.Risk_Rating ))) + 

相反,我会创建一个反应对象来在求和之前存储一个新的数据框,并根据您的选择进行过滤:

dfsum <- reactive({
df %>%
   # New code below
   filter(Risk.Risk_Rating %in% input$rating) %>%

   # Your original code
   group_by(Risk.Risk_Retired_Date, Risk.Risk_Rating) %>%
   tally()
   dfsum$Risk.Risk_Retired_Date <- factor(dfsum$Risk.Risk_Retired_Date, 
                                         levels=c("18-Jan","18-Feb","18-Mar","18-Apr",
                                                  "18-May","18-Jun","18-Jul","18-Aug",
                                                  "18-Sep","18-Oct","18-Nov","18-Dec",
                                                  "19-Jan","19-Feb"))
})
``

推荐阅读