ShinyApp: использовать выбранный вход для поднабора некоторых уровней категориальной переменной и использовать его как вход для построения графика на сервере - PullRequest
1 голос
/ 20 июня 2019

Я пытаюсь построить непрерывную переменную (y) по сравнению с другой (x) и раскрасить точки данных на графике в зависимости от третьей категориальной переменной (z).Чтобы выбрать эти три переменные, я использую функцию selectInput, но для выбора возможных категорий (уровни (input $ z)), которые я хочу построить, я использую функцию uiOutput.Я пытаюсь выделить выбранные уровни в отфильтрованном фрейме данных (dataf), но это не работает.Некоторые реактивные выражения работают, но я откатил код с поднабором, потому что, когда я использую (dataf <- filter (data (), input $ z% в% input $ show_levels)) в функции renderPlot, я не получаю никакогоТочка данных нанесена на график. </p>

Я подготовил упрощенную версию того, что мне нужно, используя набор данных diamonds.Например, мне нужно было бы мое приложение brightApp для нанесения приза на караты, с точками, окрашенными в зависимости от среза, и возможностью представлять только те, которые имеют определенный срез (например, cut == c ("Fair", "Good").)

library(shiny)
library(ggplot2)
library(RColorBrewer)
library(dplyr)

cont_vars <- c("price", "carat", "x", "y", "z", "depth", "table")
discr_vars <- c("cut", "color", "clarity")

# Define UI for application that draws a histogram
ui <- fluidPage(

   # Application title
   titlePanel("Analysis of 'diamonds' dataset"),

   # Sidebar with a slider input for number of bins 
   sidebarLayout(
      sidebarPanel(
        # Select variable for y-axis
        selectInput(inputId = "y",
                    label = "Y-axis:",
                    choices = cont_vars,
                    selected = cont_vars[1]),

        # Select variable for x-axis
        selectInput(inputId = "x",
                    label = "X-axis:",
                    choices = cont_vars,
                    selected = cont_vars[2]),

        # Select variable for color
        selectInput(inputId = "z",
                    label = "Z-axis:",
                    choices = discr_vars,
                    selected = discr_vars[1]),

        # Select level/s to show for the z category
        uiOutput("selected_z")
      ),

      # Show the plot 
      mainPanel(
         plotOutput("scatterplot")
      )
   )
)

# Define server logic required to draw a scatterplot
server <- function(input, output) {

  # Show levels for the discrete variable selected in input$selected_z
  output$selected_z <- renderUI({
    checkboxGroupInput(inputId = "show_levels",
                       label = "Select category/ies to represent:",
                       choices = choices_z(),
                       selected = choices_z())
  })

  choices_z <- reactive({
      df <- select(diamonds, input$z)
      return(levels(df[[1]]))
  })

   output$scatterplot <- renderPlot({
     # generate df based on inputs selected
     data <- select(diamonds, input$x, input$y, input$z)
     #     dataf <- filter(data(), input$z %in% input$show_levels)
      ggplot(data, aes_string(x = input$x, y = input$y,
                             color = input$z)) +
        geom_point(size = 4)  +
        scale_color_brewer(palette = "Paired") +
        theme_light()
   })
}

# Run the application 
shinyApp(ui = ui, server = server)

Я ожидал выбрать входные $ show_levels категориальные переменные (уровни) Меня интересует checkboxGroupInput (входные $ showlevels), и я показываю только точки в выбранных категориях на диаграмме рассеяния,Прямо сейчас я получил функцию checkboxGroupInput для отображения уровней (см. Изображение ниже), но я боюсь, что он не подключен к серверу, и все уровни ввода $ z отображаются., как теперь блестящее приложение

1 Ответ

1 голос
/ 20 июня 2019

Похоже, что вы почти установили его, когда пытались фильтровать данные (ваша строка комментариев начинается с dataf).Вам нужно получить filter(), чтобы распознать, что вы хотите использовать столбец, представленный input$z, а не использовать фактическое значение input$z (которое "cut").Если вы обновите renderPlot, чтобы данные фильтровались следующим образом

data <- 
  select(diamonds, input$x, input$y, input$z) %>% 
  filter(!!(as.name(input$z)) %in% input$show_levels)

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

...