我正在创建闪亮的应用程序。我的目标是根据输入可视化一些数据切片。我对结果非常满意。 但是,当应用程序加载时,我的应用程序有一些错误。绘制图形和可视化输入之前,它会在屏幕上显示一些错误(您可以激活应用程序并查看问题)。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)
感谢您的回答。还有另外一个关于修改的问题。 功能'like'允许部分匹配。是否有另一种方法来进行部分匹配? – AK47
通常'%in%'工作得很好,并且可以广泛应用。或者,您可以查看“匹配”或“子集”。在'ddplyr','data.table','sqldf'等软件包中还有很多版本可以完成子集引用,我建议使用'data.table'软件包,因为它在某些情况下优于其他,并在数据表操作中提供面包功能。不要花太多时间进行子设置,除非你做了非常计算密集的任务,那么它更好地处理列表和矩阵与数据帧相反 –
我在这里发现了另外一个问题: 'df2 < - df [ df $ Category%in%input $ Category,] df2 < - (data.table(df))[like(df $ Category,input $ Category)]' 第一行很好。 但是,我喜欢做的是过滤部分匹配。例如,当我选择'Midfielder'过滤器时,必须包含'Midfielder/Striker'。 “like”函数完成这项工作,但是当应用程序加载时出现错误。有什么建议么? – AK47