2015-05-31 74 views
1

如何選擇數據的子集並使用shiny & ggvis? 正如ggvis documentation所述,使用ggvisinput_select不可能交換數據集。除了這個限制,如果數據預處理過濾只需要執行一次,那將是非常棒的。 這是我的嘗試使用selectInput()。我希望能夠選擇部分或者顯示Shiny&ggvis動態選擇數據子集

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

回答

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


    } 
)) 

請嘗試發佈可運行的代碼和代碼中至少可以說什麼不運行或需要哪些變量的解決方案被定義等:) :)

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


    } 
))