2015-10-13 20 views
0

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

我认为,第一个问题是数据过滤。我无法弄清楚如何处理这个问题,这是什么问题。我需要使用其他方法还是其他包? (见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) 

回答

2

下应该消除这些错误:所以我改成了%in%代替datatable为#1的功能like给出了错误。和#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) 
+0

感谢您的回答。还有另外一个关于修改的问题。 功能'like'允许部分匹配。是否有另一种方法来进行部分匹配? – AK47

+0

通常'%in%'工作得很好,并且可以广泛应用。或者,您可以查看“匹配”或“子集”。在'ddplyr','data.table','sqldf'等软件包中还有很多版本可以完成子集引用,我建议使用'data.table'软件包,因为它在某些情况下优于其他,并在数据表操作中提供面包功能。不要花太多时间进行子设置,除非你做了非常计算密集的任务,那么它更好地处理列表和矩阵与数据帧相反 –

+0

我在这里发现了另外一个问题: 'df2 < - df [ df $ Category%in%input $ Category,] df2 < - (data.table(df))[like(df $ Category,input $ Category)]' 第一行很好。 但是,我喜欢做的是过滤部分匹配。例如,当我选择'Midfielder'过滤器时,必须包含'Midfielder/Striker'。 “like”函数完成这项工作,但是当应用程序加载时出现错误。有什么建议么? – AK47