Это первый раз, когда я создаю приложение, и я хотел бы знать, какую функцию или аргумент я упускаю в своем коде. Я хочу отобразить обычную гистограмму, которая динамически фильтрует «компании», которые я хотел бы видеть отображаемыми, переменную производительности (например, «прибыль») и диапазон дат.
Я считаю, что моя ошибка является результатом неточностей в shiny
вызовах, потому что то, что я хочу, довольно просто. Вы можете получить его, запустив (но без возможности взаимодействия, как это предусмотрено shiny
) следующий код:
library(ggplot2)
sample_data = data.frame(Company_Name=c("Company 1","Company 2","Company 3",
"Company 1","Company 2","Company 3",
"Company 1","Company 2","Company 3"),
Profits_MM = c(20,100,80,
45,120,70,
50,110,90),
Sales_MM = c(200,800,520,
300,1000,630,
410,1150,770),
Year=c(2016,2016,2016,
2017,2017,2017,
2018,2018,2018))
ggplot(data = sample_data, aes(x=Year, y = Profits_MM,
fill=as.factor(Company_Name))) + geom_col(position="dodge")
Но я упоминаю об этом только для того, чтобы можно было понять, что я хочу получить. Код, который я установил с блестящим, на самом деле следующий:
rm(list=ls()); gc()
library(shiny)
library(ggplot2)
library(dplyr)
sample_data = data.frame(Company_Name=c("Company 1","Company 2","Company 3",
"Company 1","Company 2","Company 3",
"Company 1","Company 2","Company 3"),
Profits_MM = c(20,100,80,
45,120,70,
50,110,90),
Sales_MM = c(200,800,520,
300,1000,630,
410,1150,770),
Year=c(2016,2016,2016,
2017,2017,2017,
2018,2018,2018))
# UI
ui <- fluidPage(
sidebarLayout(
# Input(s)
sidebarPanel(
checkboxGroupInput(inputId = "sel_com",
label = "Company Selection:",
choices = c("Company 1","Company 2","Company 3"),
selected = "Company 1"),
selectInput(inputId = "y",
label = "Performance Variable",
choices = c("Profits (in Millions)" = "Profits_MM",
"Sales (in Millions)" = "Sales_MM"),
selected = "Profits_MM"),
sliderInput("year","Year Selection:",
min=2016,
max=2018,
value=c(2017,2018),
step=1)
),
# Output(s)
mainPanel(
plotOutput(outputId = "barplot")
)
)
)
# Server
server <- function(input, output, session) {
companies_sel <- reactive({
req(input$sel_com)
filter(sample_data, Company_Name %in% input$sel_com)
})
year_sample <- reactive({
req(input$year)
if(length(input$year)>1){
Years = seq(input$year[1],input$year[2])
filter(companies_sel(), Year %in% Years)
}
if(length(input$year==1)){
filter(companies_sel(), Year %in% input$year)
}
})
output$barplot <- renderPlot({
ggplot(data = year_sample(), aes_string(x=input$year, y = input$y, fill=as.factor(input$sel_com))) +
geom_col(position="dodge")
})
}
shinyApp(ui = ui, server = server)
Я могу получить некоторую продукцию, но только для одной компании за раз и без изменения размера диапазона. Может быть, я не понимаю использование функции observeEvent
, которая может сыграть в этом роль. Так как же заставить inputSlider
- и, возможно, другие опции - адекватно взаимодействовать с графиком ggplot2
?
Вот пример ошибки в выходе: