2015-05-31 5 views
1

Как выбрать подмножество данных и построить его с помощью shinyggvis? Как указано в 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

Ваш код имеет несколько проблем, и не работает ... почему вы возвращения от основной функции сервера? И вы используете две переменные 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") 
    }) 


    } 
)) 

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

2

@daattali - У меня есть предлагаемое улучшение вашего решения. Вы используете фильтр в элементе наблюдения, который вводит 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") 
    }) 


    } 
)) 
Смежные вопросы