2015-05-25 11 views
8

Chcę użyć reaktywnej ramki danych do wyświetlenia wielu wykresów i wykresów. Mam zestaw danych, który chciałbym móc filtrować. Te znalazłem odpowiednie ustawienia filtra, chciałbym pokazać dane na wielu różnych działkach - które zaktualizują się, jeśli ustawienia filtra zostaną zmienione.Jak zbudować reaktywną ramkę danych w R/Shiny?

To może wyjaśniać, co próbuję zrobić:

UI:

fluidPage(
    sidebarLayout(
    sidebarPanel(

     checkboxGroupInput("checkGroups", 
         label = "Include", choices = list("1 star" = 1, "2 star" = 2, 
                  "3 star" = 3, "4 star" = 4, 
                  "5 star" = 5), 
         selected = list(1, 2, 3, 4, 5)), 

     checkboxInput("checkbox", "Include Replies"), 

     actionButton("Button", "Update") 

    ), 
    mainPanel(

     showOutput("plot", "nvd3"), 

     showOutput("pieplot", "nvd3") 

    ) 
) 
) 

SERVER:

rating <- c(2, 3, 5, 4, 1, 5, 3, 1, 4) 
date_time <- c("2015-05-14", "2015-05-07", "2015-05-06", "2015-04-11", "2015-01-07", "2014-12-06", "2014-04-11", "2014-01-07", "2013-12-06") 
repliesOnly <- c(TRUE, FALSE, TRUE, TRUE, FALSE, TRUE, FALSE, FALSE, TRUE) 
data <- data.frame(rating, date_time, repliesOnly) 

function(input, output, session) { 

    load("data.Rdata") 

    newdata <- reactive({ 

    filter_data <- data 

    filter_data <- filter_data %>% filter(rating %in% input$checkGroups) 

    filter_data <- filter_data %>% filter(repliesOnly %in% input$checkbox) 

    return(filter_data) 

    }) 

    output$plot <- renderChart({ 

    plot <- nPlot(rating ~ date_time, data = newdata, 
        type = "multiBarHorizontalChart", dom = 'plot') 
    return(plot) 

    }) 

    output$pieplot <- renderChart({ 

    pieplot <- nPlot(rating ~ date_time, data = newdata, 
        type = "pieChart", dom = 'pieplot') 
    return(pieplot) 

    }) 

} 

można to zrobić? Oczywiście mogę po prostu dołączyć filtr dla każdego wykresu, ale mój zbiór danych jest dość duży, a mój filtr jest dość złożony, więc jeśli powinien obliczyć to dla każdego wykresu, to trwa to wiecznie.

Cała pomoc jest głęboko doceniona!

+0

Skąd czerpiesz funkcję 'showOuput'? Przed opublikowaniem upewnij się, że Twój przykład jest powtarzalny. – nrussell

+3

Wygląda na to, że wystarczy dodać coś w rodzaju 'dat <- newdata()' w komendach renderowania danych wyjściowych i użyć 'dat' w komendach wydruku. – jenesaisquoi

+4

właściwie myślę, że po prostu możesz dodać '()' po 'newdata', jak to napisałeś, po prostu musisz wywołać' newdata'. – jenesaisquoi

Odpowiedz

6

Dzięki za pomoc - to działało:

SERVER:

library(shiny) 
library(rCharts) 

rating <- c(2, 3, 5, 4, 1, 5, 3, 1, 4) 
date_time <- c("2015-05-14", "2015-05-07", "2015-05-06", "2015-04-11", "2015-01-07", "2014-12-06", "2014-04-11", "2014-01-07", "2013-12-06") 
repliesOnly <- c(TRUE, FALSE, TRUE, TRUE, FALSE, TRUE, FALSE, FALSE, TRUE) 
data <- data.frame(rating, date_time, repliesOnly) 
data$rating <- as.character(data$rating) 


function(input, output, session) { 

    load("data.Rdata") 

    datadata <- data 
    makeReactiveBinding("datadata") 

    newData <- reactive({ 

    input$Button 
    isolate({ 

     datadata <- data 

     datadata <- subset(datadata, rating %in% input$checkGroups) 


    }) 

    }) 

    output$plot <- renderChart({ 

    datadata <- newData() 

    plot <- nPlot(rating ~ date_time, data = datadata, 
        type = "multiBarHorizontalChart", dom = 'plot') 
    return(plot) 

    }) 

    output$pieplot <- renderChart({ 

    datadata <- newData() 

    pieplot <- nPlot(rating ~ date_time, data = datadata, 
        type = "pieChart", dom = 'pieplot') 
    return(pieplot) 

    }) 

} 
1

Dziękuję za ten przykład; Potrzebuję również reaktywnego filtrowania ramek danych. Po walce 2 godziny z powodu następującego błędu:

cannot coerce class ""reactive"" to a data.frame 

Twój post pomógł mi rozwiązać problem. Mogę odważyć się na uproszczoną wersję twojego przykładu, łatwiejszą do odtworzenia (bez wywołań showOutput lub readChart), w celu późniejszego odniesienia się do innych błyszczących użytkowników.

N.B .: Używam aplikacji pojedynczego pliku.

library(shiny) 

rating <- c(2, 3, 5, 4, 1, 5, 3, 1, 4) 
date_time <- c("2015-05-14", "2015-05-07", "2015-05-06", "2015-04-11", 
"2015-01-07", "2014-12-06", "2014-04-11", "2014-01-07", "2013-12-06") 
repliesOnly <- c(TRUE, FALSE, TRUE, TRUE, FALSE, TRUE, FALSE, FALSE, TRUE) 
data <- data.frame(rating, date_time, repliesOnly) 
data$rating <- as.character(data$rating) 

ui <- fluidPage(
    sidebarLayout(
    sidebarPanel(

    checkboxGroupInput("checkGroups", 
        label = "Include", choices = c("1 star" = 1, 
                 "2 star" = 2, 
                 "3 star" = 3, 
                 "4 star" = 4, 
                 "5 star" = 5), 
        selected = list(1, 2, 3, 4, 5)) 
), 

mainPanel(
    tableOutput("view") 
    ) 
    ) 
    ) 

server <- function(input, output, session) { 
    newData <- reactive({ 
     data <- subset(data, rating %in% input$checkGroups) 
}) 

output$view <- renderTable({ newData() }) 

} 

shinyApp(ui = ui, server = server) 
Powiązane problemy