R Shiny ggplot реагирует на varSelectInput - PullRequest
0 голосов
/ 06 мая 2020

Я пытаюсь понять, как сделать вывод ggplot реактивным на функцию varSelectInput в пользовательском интерфейсе моего блестящего приложения. Например, я хотел бы иметь возможность выбрать две разные переменные и увидеть их график как функцию друг от друга. В этом примере я использовал набор данных о рейсах ie., Выберите arr_time и dep_delay и посмотрите arr_time на оси x и dep_delay на оси y.

DateRangeInput пока не имеет функции, но в конечном итоге я хотел бы иметь возможность отфильтровать результаты, которые отображаются в выводе ggplot по месяцам.

library(tidyverse)
library(shiny)
flights <- nycflights13::flights

# Define UI for application
ui <- navbarPage(
    "NYC Flights",

    tabPanel(
        "Flights",
        sidebarPanel(
            h4("Flight Inputs"),
            selectInput(
                "Airline_Select",
                label = "Select Airline",
                choices = flights$Carrier,
                selected = TRUE
            ),
            dateRangeInput(
                "dates",
                label = "Dates",
                start = min(flights$Month),
                end = max(flights$Month),
                min = min(flights$Month),
                max = max(flights$Month)
            ),
            varSelectInput(
                "X_Axis",
                label = "Select Variable 1",
                data = flights
            ),
            varSelectInput(
                "Y_Axis",
                label = "Select Variable 2",
                data = flights
            ),
        ),
    )
)

mainPanel(plotOutput("flights_plot"))


# Define server logic
server <- function(input, output) {

    output$flights_plot <- renderPlot({
        ggplot(data = flights, aes(x = input$X_Axis, y = input$Y_Axis)) + geom_point()
    })
}
# Run the application 
shinyApp(ui = ui, server = server)

1 Ответ

2 голосов
/ 06 мая 2020

Добро пожаловать в stackoverlfow.

Есть несколько вещей, которые вам нужно изменить, чтобы иметь функциональное приложение. Я помещаю здесь краткое изложение того, что я видел, и детали в коде в виде комментариев.

  1. Подготовьте свои данные, вам следует подумать о создании переменных
  2. Не помещайте весь вектор с повторяющиеся значения в качестве аргумента choices в selectInput, вы должны передавать отдельные параметры.
  3. Рекомендуется выбирать значение, когда это возможно. таким образом ваше приложение будет запускаться с тем, что будет отображаться по умолчанию.
  4. Используйте входные данные для фильтрации данных.
  5. selectInput создайте строковое значение, поэтому вы должны использовать aes_string в вашем аргументе ggplot mapping.
library(shiny)
library(tidyverse)


# You have to Adequate your data: You have to create a dete variable
# in order to make the `dateRangeInput` work. You can do that using
# `year`, `month` and `day` variables as follow.
flights <- nycflights13::flights %>% 
    mutate(
        date = as.Date(paste(year, month, day, sep = "-"))
    )

ui <- navbarPage(
    title = "NYC Flights",
    tabPanel(
        title = "Flights",
        sidebarPanel(
            h4("Flight Inputs"),
            # The choices argument should be the unique
            # list of arilines, not the whole vector with
            # duplicates
            selectInput(
                "airline",
                label = "Select Airline",
                choices = unique(flights$carrier), 
                selected = 'UA' # It is a good idea to select a value
                # visible when you launch the app
            ),
            dateRangeInput(
                "dates",
                label = "Dates",
                start = min(flights$date),
                end = max(flights$date)
                ),
            varSelectInput(
                "X_Axis",
                label = "Select Variable 1",
                data = flights,
                selected = "date" # selecting one
            ),
            varSelectInput(
                "Y_Axis",
                label = "Select Variable 2",
                data = flights,
                selected = "dep_delay" # selecting one
            )
        ),

        mainPanel(
            plotOutput("plot")
        )

    )

)

server <- function(input, output, session) {

    output$plot <- renderPlot({
        flights %>% 
            # Use your inputs to filter the data
            filter(date >= input$dates[1], date <= input$dates[2], carrier == input$airline) %>% 
            # since the selectImput create a character element, you should use 
            # ase_string() to map the x an y variables
            ggplot(aes_string(x = input$X_Axis, y = input$Y_Axis)) +
            geom_point()
    })

}

shinyApp(ui, server)

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