R блестящий: одновременный фильтр по имени и значению переменной - PullRequest
0 голосов
/ 03 декабря 2018

Я пытаюсь создать блестящее приложение, которое возвращает график, основанный на триплете (переменная, мин, макс), выбранном пользователем.Я, вероятно, что-то упускаю в войне и оцениваю заявления, но мой инстинктивный способ сделать это не работает.Условие типа: filter(iris, input$variable >= input$range[1] & input$variable <= input$range[2] не приводит к пустому набору данных.

Вот пример с набором данных iris :

library(shiny)
library(tidyverse)

    ui <- fluidPage(
 titlePanel("Filter example"),

   sidebarLayout(
      sidebarPanel(
         sliderInput("dimension",
                     "Dimension:",
                     min = 1,
                     max = 8,
                     value = c(1,8)),
         selectInput("Petal or Sepal", "type", 
                     c("Sepal Length" = "Sepal.Length",
                       "Petal Length" = "Petal.length"))
      ),

      mainPanel(
         plotOutput("distPlot")
      )
   )
)

server <- function(input, output) {

   plotdata <- reactive({
     filter(iris, input$type <= input$dimension[1] & input$type >= input$dimension[2])
   })

   output$distPlot <- renderPlot({

    MyPlot <-  ggplot(data = plotdata(),
            mapping = aes(x = Sepal.Width, fill = Species))
    Myplot + geom_histogram()
   })
}

shinyApp(ui = ui, server = server)

Проблема, очевидно, заключается в

plotdata <- reactive({
         filter(iris, input$type <= input$dimension[1] & input$type >= input$dimension[2])
       })

, но после нескольких часов траления через StackOverflow я не смог найти решение.

Спасибо за вашу помощь

1 Ответ

0 голосов
/ 03 декабря 2018

В примере кода есть некоторые несоответствия параметров и опечатки.Ваша реализация фильтрации также имеет проблемы.Должно работать следующее:

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

ui <- fluidPage(
  titlePanel("Filter example"),
  sidebarLayout(
    sidebarPanel(
      sliderInput(
        inputId = "dimension",
        label = "Dimension:",
        min = 1,
        max = 8,
        value = c(1,8)),
      selectInput(
        inputId = "type", 
        label = "Petal or Sepal",
        choices = c(
          "Sepal Length" = "Sepal.Length",
          "Petal Length" = "Petal.Length"
        )
      )
    ),
    mainPanel(
      plotOutput("distPlot")
    )
  )
)

server <- function(input, output) {

  plotdata <- reactive({
    iris[(iris[ , input$type] >= input$dimension[1] & iris[ , input$type] <= input$dimension[2]), ]
  })

  output$distPlot <- renderPlot({
    ggplot(
      data = plotdata(),
      mapping = aes(x = Sepal.Width, fill = Species)
    ) + 
      geom_histogram()
  })
}

shinyApp(ui = ui, server = server)
...