sliderInput в блестящем - не может правильно установить его в ggplot2 и обновить его - PullRequest
1 голос
/ 13 марта 2019

Это первый раз, когда я создаю приложение, и я хотел бы знать, какую функцию или аргумент я упускаю в своем коде. Я хочу отобразить обычную гистограмму, которая динамически фильтрует «компании», которые я хотел бы видеть отображаемыми, переменную производительности (например, «прибыль») и диапазон дат.

Я считаю, что моя ошибка является результатом неточностей в 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?

Вот пример ошибки в выходе:

enter image description here

1 Ответ

1 голос
/ 13 марта 2019

Попробуйте этот код:

   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")






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)

    sample_data_gg<-filter(sample_data, Company_Name %in% input$sel_com)
  #  print(sample_data_gg)
    sample_data_gg

  })

  year_sample <- reactive({

    req(input$year)
    sample_data_gg <- sample_data
    if(length(input$year)>1){

      Years = seq(input$year[1],input$year[2])

      sample_data_gg<-filter(companies_sel(), Year %in% Years)

    }  

    if(length(input$year==1)){

      sample_data_gg<-filter(companies_sel(), Year %in% input$year)

    }
  #  print(sample_data_gg)
    sample_data_gg
  })


  output$barplot <- renderPlot({
    sample_data_gg <- year_sample()
    y <- input$y

    ggplot(data = sample_data_gg, aes(x=Year, y =get( y ), fill=Company_Name)) +

      geom_col(position="dodge")

  })

}

shinyApp(ui = ui, server = server)

Я предпочитаю сначала сохранить year_sample(), поэтому мне не нужно использовать input или aes_string в моем ggplot. Кроме того, я предпочитаю get в другом ссылаться на столбец по его string имени.

Best!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...