2013-12-19 13 views
6

Ich bin eine Web-Anwendung mit glänzend, und ich bin mir nicht sicher, wie Sie die App am besten strukturieren, da die Eingaben von Daten abhängen und die Ausgaben (Diagramme) abhängig von aggregierten Daten basierend auf Eingaben .R glänzende App mit Eingaben abhängig von aktualisierten Daten

Ich habe versucht, eine einfache Anwendung zu erstellen, um das Problem zu reproduzieren. Mein Setup ist fortgeschrittener und hat nichts mit dem Beispiel zu tun. Angenommen, Sie haben eine Produktlinie und möchten Verkäufe analysieren. Angenommen, ein Datensatz wird für jeden Tag erstellt (ich sage nicht, dass die Datenstruktur optimal ist, aber zur Veranschaulichung meiner Frage nützlich ist). Jetzt wählt man in der Anwendung ein Datum aus einer Liste verfügbarer Daten und wählt dann ein Produkt aus. Die Daten sind auf den Zeitraum beschränkt, für den Daten verfügbar sind, und die Produktliste ist auf Produkte beschränkt, die am ausgewählten Tag tatsächlich verkauft wurden. Dann möchten wir den Gesamtverkaufswert für jede Stunde während des Tages grafisch darstellen.

Ich werde einige Code für ein solches Beispiel unten aufgelistet, wo einige Beispieldaten auch erstellt werden. Entschuldigung für den "langen" Code. Es funktioniert, aber ich habe einige Bedenken.

Meine Fragen sind: jedes Mal eine Eingangsänderungen

1) Ich frage mich, in welcher Reihenfolge die Dinge ausgeführt werden, insbesondere dann, wenn die App zum ersten Mal geladen wird, und dann. Die Daten hängen wiederum von der ersten Eingabe ab, die zweite Eingabe hängt von den Daten ab. Drittens wird ein Diagramm-freundlicher Datensatz berechnet, der für den Graphen verwendet wird. Möglicherweise stellen Sie fest, dass Fehler auf der Konsole ausgegeben werden (und im Browser kurz blinken), aber sobald die Werte verfügbar sind, werden Aktualisierungen vorgenommen und die Grafik angezeigt. Es scheint suboptimal zu sein.

2) Was ist die aktuelle Best Practice, wenn die Eingänge von data/server abhängen? Ich sah dies https://groups.google.com/forum/?fromgroups=#!topic/shiny-discuss/JGJx5A3Ge-A aber es scheint, als ob dies nicht umgesetzt wird, auch wenn der Beitrag eher alt ist. Hier

ist der Code für die beiden Dateien:

# ui.R 
###### 

library(shiny) 

shinyUI(pageWithSidebar(

    headerPanel("New Application"), 

    sidebarPanel(
    htmlOutput("dateInput"), 
    htmlOutput("prodInput") 
), 

    mainPanel(
    plotOutput("salesplot") 
) 

)) 

Und:

#server.R 
######### 

library(shiny) 
library(filehash) 

set.seed(1) 

dates <- format(seq(Sys.Date() - 10, Sys.Date(), "days"), "%Y-%m-%d") 
products <- LETTERS 
prices <- sample(10:100, size = length(products), replace = TRUE) 
names(prices) <- LETTERS 

if (file.exists("exampledb")) { 

    db <- dbInit("exampledb") 

} else { 

    dbCreate("exampledb") 
    db <- dbInit("exampledb") 

    for (d in dates) { 
    no.sales <- sample(50:100, size = 1) 
    x <- data.frame(
     product  = sample(products, size = no.sales, replace = TRUE) 
     ,hour  = sample(8:20, size = no.sales, replace = TRUE) 
     ,order.size = sample(1:10, size = no.sales, replace = TRUE) 
    ) 
    x$price <- prices[x$product] 
    dbInsert(db, paste0("sales", gsub("-", "", d)), x) 
    } 
} 


current <- reactiveValues() 

shinyServer(function(input, output) { 

    inputDates <- reactive({ 
    sort(strptime(unique(substr(names(db), 6, 13)), "%Y%m%d")) 
    }) 

    output$dateInput <- renderUI({ dateInput(
    inputId = "date", 
    label  = "Choose hour", 
    min  = min(inputDates()), 
    max  = max(inputDates()), 
    format  = "yyyy-mm-dd", 
    startview = "month", 
    weekstart = 0, 
    language = "en") 
    }) 

    inputProducts <- reactive({ 
    current$data <<- dbFetch(db, paste0("sales", format(input$date, "%Y%m%d"))) 
    sort(unique(current$data$product)) 
    }) 

    output$prodInput <- renderUI({ selectInput(
    inputId = "product", 
    label  = "Choose Product", 
    choices = inputProducts(), 
    selected = 1) 
    }) 

    output$salesplot <- renderPlot({ 
    pdata <- aggregate(I(order.size*price) ~ hour, 
     data = subset(current$data, product == input$product), 
     FUN = sum) 
    colnames(pdata)[2] <- "value"  
    plot(value ~ hour, data = pdata, xlim = c(8, 20)) 
    }) 


}) 
+0

In Bezug auf die 'google group diskussion' sagt eine der letzten Nachrichten von @WinstonChang, dass die erwähnten Änderungen bereits in der Version '0.6.0' zusammengeführt wurden. IIRC, aktuelle Version ist "0.7.0", also sollten Sie in der Lage sein, es zu benutzen. Was Punkt 1 betrifft, kann ich es jetzt nicht sagen, da ich zu meiner Shiny-Umgebung kommen müsste. Wie auch immer, Sie können versuchen, 'cat' zu verwenden, um die Ausführung von' server.R' zu verfolgen. –

+0

Konnten Sie dieses Problem lösen? Ich habe das gleiche Problem. –

Antwort

2

es so scheint, wäre ein guter Ort global.R zu verwenden. Die Datei global.R wird vor ui.R und server.R gelesen, so dass Daten von global zugänglich sowohl für den ui als auch für den Server abgerufen werden können.

Verwandte Themen