我正在尝试使用2个可视化(数据表和条形图)创建一个闪亮的仪表板,允许用户同时对两个可视化应用相同的过滤器。我尝试使用显示的here解决方案,但我想我错过了一些东西。 “Data5”是我用来填充的数据框的名称。任何帮助将不胜感激。
server.R
library(shiny)
library(ggplot2)
library(dplyr)
dt <- data5
shinyServer(function(input, output) {
data <- reactive({data5
if (input$year != "All"){
data <- data[data5$year == input$year,]
}
if (input$month != "All"){
data <- data[data5$month == input$month,]
}
if (input$partner_name != "All"){
data <- data[data5$partner_name == input$partner_name,]
}
if (input$cube_title != "All"){
data <- data[data5$cube_title == input$cube_title,]
}
})
#plots
output$table1 <- renderDataTable({
data
})
output$plot1 <- renderPlot({
ggplot(data=subset(data5,cube_title=="Leads"), aes(x=month,y=f0_)) + geom_bar(fill="blue", stat = "identity") + ylab("Leads") + ggtitle("Leads")
})
output$plot2 <- renderPlot({
ggplot(data=subset(data5,cube_title==c("CommunityProfileViews","HomeProfileViews")), aes(x=month,y=f0_)) + geom_bar(fill="blue", stat = "identity") + ylab("Profile Views") + ggtitle("Profile Views")
})
})
ui.R
dashboardPage(
skin = "blue",
dashboardHeader(title = "Basic dashboard"),
dashboardSidebar(
(
selectInput("year",
"Year:",
c("All",
unique(as.character(data5$year))))
),
(
selectInput("month",
"Month:",
c("All",
unique(as.character(data5$month))))
),
(
selectInput("partner_name",
"Partner:",
c("All",
unique(as.character(data5$partner_name))))
),
(
selectInput("cube_title",
"Metric:",
c("All",
unique(as.character(data5$cube_title))))
)
),
dashboardBody(
tabsetPanel(id = "tabSelected",
tabPanel("Charts", plotOutput("plot1"),
box(plotOutput("plot2"))),
tabPanel("DataTable", dataTableOutput("table1"))
)
)
)
答案 0 :(得分:4)
问题1:被动返回一个函数,而不是一个对象。因此,我们需要在您的data()
和data
函数中调用renderDataTable
,而不是renderPlot
问题2:您需要将data()
放入渲染功能中。目前,它正在调用data5
,这不是被动的:
output$plot1 <- renderPlot({
Temp <- data()
ggplot(data=subset(Temp,cube_title=="Leads"), aes(x=month,y=f0_)) + geom_bar(fill="blue", stat = "identity") + ylab("Leads") + ggtitle("Leads")
})
问题3:您的被动功能会返回分配呼叫。我会更喜欢这样做:
data <- reactive({ #The data5 that was here is not necessary
temp <- data5
if (input$year != "All"){
temp <- temp[temp$year == input$year,]
}
if (input$month != "All"){
temp <- temp[temp$month == input$month,]
}
if (input$partner_name != "All"){
temp <- temp[temp$partner_name == input$partner_name,]
}
if (input$cube_title != "All"){
temp <- temp[temp$cube_title == input$cube_title,]
}
return(temp)
})
因此,现在当我们致电data()
时,我们会返回已过滤的data.frame
问题4 :(虽然不是问题)我会避免使用data
作为对象名称。这意味着别的东西,在阅读代码时经常会让人感到困惑。使用更安全的DT
或其他内容。您始终可以通过在控制台中键入exists("NameToCheck")
来检查名称是否正在使用中。