Shiny и ggvis динамически выбирают подмножество данных

как я могу выбрать подмножество данных и построить его с помощью shiny и ggvis? Как указано в документации ggvis, невозможно поменять местами набор данных с помощью ggvis input_select. Помимо этого ограничения, было бы здорово, если бы предварительная обработка и фильтрация данных выполнялась только один раз. Это моя попытка использовать selectInput(). Я хочу иметь возможность выбирать части или весь набор данных для отображения

library(ggvis)
library(dplyr)


set.seed(1233)
cocaine <- cocaine[sample(1:nrow(cocaine), 500), ]

shinyServer(function(input, output, session) {

  output$choose_dataset <- renderUI({
    selectInput("dataset", "Select", append("Give me all!", as.list(sort(unique(cocaine$state)))))
  })

    if(input$dataset != "Give me all!"){
     a <- filter(rawData, cocaine$state == input$dataset)
  }
  if(input$dataset == "Give me all!"){
     a <- cocaine
  }
  a$id <- 1:nrow(a)
  return(a)

    datFiltered %>%
    ggvis(~weight, ~price, key := ~id) %>%
    bind_shiny("plot1") # Very important!
})

Вот пользовательский интерфейс

library(ggvis)

shinyUI(bootstrapPage(
  uiOutput("choose_dataset"),
  ggvisOutput("plot1")
  ))

person Georg Heiler    schedule 31.05.2015    source источник


Ответы (2)


В вашем коде есть несколько проблем, и он не запускается... почему вы возвращаетесь из основной функции сервера? И вы используете две переменные dataFiltered и rawData, которые нигде не определены.

Вот решение того, что вы пытаетесь сделать

runApp(shinyApp(
  ui = fluidPage(
    uiOutput("choose_dataset"),
    ggvisOutput("plot1")
  ),
  server = function(input, output, session) {
    output$choose_dataset <- renderUI({
      selectInput("dataset", "Select", append("Give me all!", as.list(sort(unique(cocaine$state)))))
    })

    observeEvent(input$dataset, {
      if(input$dataset == "Give me all!"){
        data <- cocaine
      } else {
        data <- filter(cocaine, cocaine$state == input$dataset)
      }
      data$id <- seq(nrow(data))

      data %>%
        ggvis(~weight, ~price, key := ~id) %>%
        layer_points() %>%
        bind_shiny("plot1") 
    })


  }
))

Пожалуйста, попробуйте опубликовать код, который можно запустить или, по крайней мере, сделать в коде, указав, что не работает или какие переменные необходимо определить и т. д. :)

person DeanAttali    schedule 31.05.2015

@daattali - у меня есть предложение улучшить ваше решение. Вы используете фильтр вObservEvent, который вводит NA в решение и вызывает неправильное срабатывание события. Вместо этого используйте подмножество, как показано ниже:

runApp(shinyApp(
  ui = fluidPage(
    uiOutput("choose_dataset"),
    ggvisOutput("plot1")
  ),
  server = function(input, output, session) {
    output$choose_dataset <- renderUI({
      selectInput("dataset", "Select", append("Give me all!", as.list(sort(unique(cocaine$state)))))
    })

    observeEvent(input$dataset, {
      if(input$dataset == "Give me all!"){
        data <- cocaine
      } else {
        data <- subset(cocaine, cocaine$state == input$dataset)
      }
      data$id <- seq(nrow(data))

      data %>%
        ggvis(~weight, ~price, key := ~id) %>%
        layer_points() %>%
        bind_shiny("plot1")
    })


  }
))
person David Herman    schedule 03.06.2015