【问题标题】:ShinyApp errors: selectInput, data-subsettingShinyApp 错误:selectInput、数据子集
【发布时间】:2016-01-10 22:30:44
【问题描述】:

我正在创建闪亮的应用程序。我的目标是根据输入可视化一些数据切片。我对结果非常满意。 但是,我的应用程序在加载时有一些错误。在绘制图表和可视化输入之前,它会在屏幕上显示一些错误(您可以启动应用程序并查看问题)。

我相信,第一个问题是数据过滤。我无法弄清楚如何处理它以及有什么问题。我是否需要使用其他方法或其他软件包? (见output$Brand)。

Error in grep(pattern, levels(vector)) : invalid 'pattern' argument

当我创建selectInput 时出现第二个错误。我想在一个图中可视化特定类别的所有品牌,并可以选择按品牌过滤数据。但是,我的方法效果不佳。有什么建议? (见output$Brand)。

Error in if (input$Brand == "All") { : argument is of length zero

另外,我附上你可以生成的代码。

您对如何简化代码有更多建议吗?

感谢您的帮助!

library(shiny)
library(shinydashboard)
library(data.table)
library(ggplot2)
library(grid)
library(scales)
library(ggthemes)



# Header -----------------------------------------------------------

header <- dashboardHeader(title="Dashboard")

# Sidebar --------------------------------------------------------------

sm <- sidebarMenu(
  menuItem(
    text="Graph1",
    tabName="Graph1",
    icon=icon("home")
    )
)

sidebar <- dashboardSidebar(sm)

# Body --------------------------------------------------

body <- dashboardBody(

# Layout  --------------------------------------------  

tabItems(
 tabItem(
  tabName="Graph1",

  fluidPage(
         fluidRow(

      box(
        title = "Inputs", status = "warning", width = 2, solidHeader = TRUE,

        uiOutput("Year"),
        uiOutput("Category"),
        uiOutput("Brand"),
        sliderInput("Finalas.Range", "Months:",
                    min = 1, max = 12, value = c(1,12)) 

         ),

      box(
        title = "Season", width = 10, status = "info", solidHeader = TRUE,

        plotOutput("Graph1")

   )  
  )
)
)
)
)

# Setup Shiny app UI components -------------------------------------------

ui <- dashboardPage(header, sidebar, body, skin="black")

# Setup Shiny app back-end components -------------------------------------

server <- function(input, output) {

# Generate data --------------------------------------

  set.seed(1992)
  n=99
  Year <- sample(2013:2015, n, replace = TRUE, prob = NULL)
  Month <- sample(1:12, n, replace = TRUE, prob = NULL)
  Category <- sample(c("Car", "Bus", "Bike"), n, replace = TRUE, prob = NULL)
  Brand <- sample("Brand", n, replace = TRUE, prob = NULL)
  Brand <- paste0(Brand, sample(1:14, n, replace = TRUE, prob = NULL))
  USD <- abs(rnorm(n))*100

  df <- data.frame(Year, Month, Category, Brand, USD)



  # Inputs --------------------------------------
  output$Year <- renderUI({
  selectInput("Year", 
            "Year:", 
            c(unique(as.character(df$Year))), selected = "2015")
  })


  output$Category <- renderUI({
    selectInput("Category", "Choose category:", 
            choices = c("Car","Bus", "Bike" ))
  })


  output$Brand <- renderUI({
    df2 <- (data.table(df))[like(df$Category,input$Category)]
    selectInput("Brand", 
            "Brand:", 
            c("All", unique(as.character(df2$Brand)))) 
  })


  # Plot --------------------------------

  output$Graph1 <- renderPlot({

df <- data.table(df)

      if (input$Brand == "All") {

        df <- df[like(df$Year, input$Year)]   
        df <- df[like(df$Category,input$Category)] 

        ggplot(df, aes(x=factor(Month,levels=1:12), y=USD, fill=Brand))+
          geom_bar(stat='identity')+
          scale_x_discrete('Month', breaks=factor(1:12), drop=FALSE)+
          scale_fill_gdocs(guide = guide_legend(title = "Brand"))

      } else {


        df <- df[like(df$Year, input$Year)]   
        df <- df[like(df$Category,input$Category)] 
        df <- df[which(df$Brand == input$Brand),]

        validate(
          need(sum(df$USD)>0, paste(input$Brand, "was inactive in Year:",input$Year))
          )

        ggplot(df, aes(x=factor(Month,levels=1:12), y=USD, fill=Brand))+
          geom_bar(stat='identity')+
          scale_x_discrete('Month', breaks=factor(1:12), drop=FALSE) 
      }

  })

# ----------------------------------------------------------------------------- 

}

# Render Shiny app --------------------------------------------------------

shinyApp(ui, server)

【问题讨论】:

    标签: r data.table shiny subset shinydashboard


    【解决方案1】:

    以下应该消除这些错误:对于#1,datatable 中的函数like 给出了错误,所以我将其改为%in%。对于#2,您默认使用null,因此请使用if 声明来处理它

    rm(list = ls())
    library(shiny)
    library(shinydashboard)
    library(data.table)
    library(ggplot2)
    library(grid)
    library(scales)
    library(ggthemes)
    
    
    # Header -----------------------------------------------------------
    
    header <- dashboardHeader(title="Dashboard")
    
    # Sidebar --------------------------------------------------------------
    
    sm <- sidebarMenu(
      menuItem(
        text="Graph1",
        tabName="Graph1",
        icon=icon("home")
      )
    )
    
    sidebar <- dashboardSidebar(sm)
    
    # Body --------------------------------------------------
    
    body <- dashboardBody(
    
      # Layout  --------------------------------------------  
    
      tabItems(
        tabItem(
          tabName="Graph1",
    
          fluidPage(
            fluidRow(
    
              box(
                title = "Inputs", status = "warning", width = 2, solidHeader = TRUE,
    
                uiOutput("Year"),
                uiOutput("Category"),
                uiOutput("Brand"),
                sliderInput("Finalas.Range", "Months:",
                            min = 1, max = 12, value = c(1,12)) 
    
              ),
    
              box(
                title = "Season", width = 10, status = "info", solidHeader = TRUE,
    
                plotOutput("Graph1")
    
              )  
            )
          )
        )
      )
    )
    
    # Setup Shiny app UI components -------------------------------------------
    
    ui <- dashboardPage(header, sidebar, body, skin="black")
    
    # Setup Shiny app back-end components -------------------------------------
    
    server <- function(input, output) {
    
      # Generate data --------------------------------------
    
      set.seed(1992)
      n=99
      Year <- sample(2013:2015, n, replace = TRUE, prob = NULL)
      Month <- sample(1:12, n, replace = TRUE, prob = NULL)
      Category <- sample(c("Car", "Bus", "Bike"), n, replace = TRUE, prob = NULL)
      Brand <- sample("Brand", n, replace = TRUE, prob = NULL)
      Brand <- paste0(Brand, sample(1:14, n, replace = TRUE, prob = NULL))
      USD <- abs(rnorm(n))*100
    
      df <- data.frame(Year, Month, Category, Brand, USD)
    
    
    
      # Inputs --------------------------------------
      output$Year <- renderUI({
        selectInput("Year", 
                    "Year:", 
                    c(unique(as.character(df$Year))), selected = "2015")
      })
    
    
      output$Category <- renderUI({
        selectInput("Category", "Choose category:", 
                    choices = c("Car","Bus", "Bike" ))
      })
    
    
      output$Brand <- renderUI({
    
    
        # first error
        #df2 <- (data.table(df))[like(df$Category,input$Category)]
    
        df2 <- df[df$Category %in% input$Category,]
    
    
        selectInput("Brand", 
                    "Brand:", 
                    c("All", unique(as.character(df2$Brand)))) 
      })
    
    
      # Plot --------------------------------
    
      output$Graph1 <- renderPlot({
    
        df <- data.table(df)
    
        if(is.null(input$Brand) || is.na(input$Brand)){return()}
    
        else if (input$Brand == "All") {
    
          df <- df[like(df$Year, input$Year)]   
          df <- df[like(df$Category,input$Category)] 
    
          ggplot(df, aes(x=factor(Month,levels=1:12), y=USD, fill=Brand))+
            geom_bar(stat='identity')+
            scale_x_discrete('Month', breaks=factor(1:12), drop=FALSE)+
            scale_fill_gdocs(guide = guide_legend(title = "Brand"))
    
        } else {
    
    
          df <- df[like(df$Year, input$Year)]   
          df <- df[like(df$Category,input$Category)] 
          df <- df[which(df$Brand == input$Brand),]
    
          validate(
            need(sum(df$USD)>0, paste(input$Brand, "was inactive in Year:",input$Year))
          )
    
          ggplot(df, aes(x=factor(Month,levels=1:12), y=USD, fill=Brand))+
            geom_bar(stat='identity')+
            scale_x_discrete('Month', breaks=factor(1:12), drop=FALSE) 
        }
    
      })
    
      # ----------------------------------------------------------------------------- 
    
    }
    
    # Render Shiny app --------------------------------------------------------
    
    shinyApp(ui, server)
    

    【讨论】:

    • 感谢您的回答。还有一个关于子集的问题。函数like 允许部分匹配。还有其他方法可以进行部分匹配吗?
    • 一般%in% 工作得很好,适用范围很广。或者,您可以查看matchsubset。包中还有许多版本,例如 ddplyrdata.tablesqldf 可以很好地进行子集引用,我建议使用 data.table 包,因为在某些情况下它的性能优于其他包并提供面包数据表操作中的功能。不要在子设置上花费太多时间,除非您正在执行计算量非常大的任务,否则最好使用与数据框相反的列表和矩阵
    • 我在这里发现了另一个问题:df2 &lt;- df[df$Category %in% input$Category,] df2 &lt;- (data.table(df))[like(df$Category,input$Category)] 第一行效果很好。但是,我喜欢做的是过滤部分匹配。例如,当我选择Midfielder 时,过滤器必须包含Midfielder / Strikerlike 函数可以完成这项工作,但在加载应用程序时出现错误。有什么建议吗?
    猜你喜欢
    • 1970-01-01
    • 2018-04-14
    • 2018-07-28
    • 2019-06-19
    • 1970-01-01
    • 2018-12-28
    • 1970-01-01
    • 2019-05-01
    • 2021-06-23
    相关资源
    最近更新 更多