2016-10-04 1 views
3

Ich habe die dygraphs-Bibliothek verwendet, um einige sehr schöne Zeitreihen Plots in eine glänzende App zu legen. Besonders gerne verwende ich das group Argument zu dygraph in Kombination mit dyRangeSelector, um den Zoom-Level über mehrere Dygraphs zu synchronisieren.Extrakt dyRangeSelector Werte von dygraph in glänzenden App

Gibt es eine Möglichkeit, andere glänzende Ausgänge reaktiv zu Benutzermanipulationen der Bereichswähler zu machen? Nehmen Sie dieses Beispiel-App, die eine einfache dygraph zeigt und fasst die Serie in einer Tabelle unten:

# app.R 
library(shiny) 
library(dygraphs) 
library(dplyr) 

indoConc <- Indometh[Indometh$Subject == 1, c("time", "conc")] 

ui <- fluidPage(
    dygraphOutput("plot"), 
    tableOutput("table") 
) 

server <- shinyServer(function(input, output) { 

    output$plot <- renderDygraph({ 
    indoConc %>% 
     dygraph %>% 
     dyRangeSelector 
    }) 

    output$table <- renderTable({ 
    indoConc %>% 
     filter(time >= min(indoConc$time), time <= max(indoConc$time)) %>% 
     summarise(total_conc = sum(conc)) 
    }) 
}) 

shinyApp(ui, server) 

Ich mag würde, dass die Tabelle nur Summe über das Zeitintervall zur Zeit durch den Benutzer ausgewählt. Dies bedeutet, dass die Zeile filter so geändert wird, dass sie etwas anderes als diese Min/Max-Punkte verwendet (was zu keiner Filterung führt).

Wie kann ich diese beiden Werte aus dem Bereichswähler im entsprechenden Format extrahieren, so dass ich sie in diesem filter Aufruf verwenden kann, und die Tabelle aktualisieren reaktiv, wie der Benutzer die Schieberegler bewegt?

+1

ich sehen kann, theres einige versteckte Eingänge wie 'plot_date_window' ich verwenden kann, dank dieser Antwort: http://stackoverflow.com/questions/30955578/r-shiny-dygraphs -Serie-reagiert-auf-Datum-Fenster. Der Trick besteht nun darin, meine y-Werte aus der Nicht-Zeitreihe zu extrahieren. ist es möglich? – ClaytonJY

Antwort

2

Da Ihr time Variable in den dataframe ist eine 3-stellige Variable Ich würde vorschlagen, dass Sie das datetime Objekt in ein character konvertieren und dann die letzten drei Ziffern wählen, die Sie benötigen, und grobe es zu einem numeric zur weiteren Verwendung, wie so:

rm(list = ls()) 
library(shiny) 
library(dygraphs) 
library(dplyr) 
library(stringr) 

indoConc <- Indometh[Indometh$Subject == 1, c("time", "conc")] 
takeLastnvalues <- -3 
ui <- fluidPage(dygraphOutput("plot"),tableOutput("table")) 

server <- shinyServer(function(input, output,session) { 

    values <- reactiveValues() 
    observeEvent(input$plot_date_window,{ 
    value1 <- input$plot_date_window[[1]] 
    value2 <- input$plot_date_window[[2]] 
    value1 <- sub("Z", "", value1) 
    value2 <- sub("Z", "", value2) 
    value1 <- str_sub(value1,takeLastnvalues,-1) 
    value2 <- str_sub(value2,takeLastnvalues,-1) 
    values$v1 <- as.numeric(value1) 
    values$v2 <- as.numeric(value2) 
    }) 

    output$plot <- renderDygraph({ 
    indoConc %>% 
     dygraph %>% 
     dyRangeSelector 
    }) 

    output$table <- renderTable({ 
    indoConc %>% 
     filter(time >= min(values$v1), time <= max(values$v2)) %>% 
     summarise(total_conc = sum(conc)) 
    }) 
}) 

shinyApp(ui, server) 

enter image description here

+0

Beachten Sie, dass Sie nur ganze Zahlen extrahieren können. (in Ihrem Screenshot 'Werte $ v1 = 2' und' Werte $ v2 = 4') – GyD

+0

@GyD Ich bemerkte das auch; Ist das eine inhärente Einschränkung meines Setups, oder gibt es eine Möglichkeit, den "vollen" Wert dieser Endpunkte zu erhalten? – ClaytonJY

+0

Ich habe an der Korrektur gearbeitet, aber es hat mit 'dygraphs' zu tun, wo der Zeitstempel nur im Millisekundenbereich liegt und es bereits einige Tickets dazu gibt. Du kannst deine 'time'variable so modifizieren, dass sie in tausenden ist und sie dann nach der Auswahl zurückpasst. –

Verwandte Themen