闪亮& ggvis动态选择数据子集

时间:2015-05-31 15:50:53

标签: r shiny ggvis

如何选择数据的子集并使用shiny& ggvis? 正如ggvis documentation所述,无法使用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!
})

这是UI

library(ggvis)

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

2 个答案:

答案 0 :(得分:3)

您的代码有一些问题而且没有运行...为什么要从主服务器功能返回?并且您使用的是未在任何地方定义的两个变量dataFilteredrawData

以下是您正在尝试做的解决方案

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


  }
))

请尝试发布可以运行的代码,或者至少在代码中说明不运行的代码或需要定义的变量等等。)

答案 1 :(得分:2)

@daattali - 我建议您改进解决方案。您在observeEvent中使用过滤器,它将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")
    })


  }
))