2013-12-19 68 views
6

我正在建設一個使用閃亮的Web應用程序,我不確定如何最好地構建應用程序,因爲輸入取決於數據和輸出(圖表)取決於基於輸入的彙總數據。R閃亮的應用程序,輸入取決於更新的數據

我試圖想出一個簡單的應用程序來重現問題。我的設置更先進,與示例無關。假設你有一個產品線,並想分析銷售。假設每天都創建一個數據集(我不是說數據結構是最優的,但它對於說明我的問題很有用)。現在在應用程序中,從可用日期列表中選擇一個日期,然後選擇一個產品。日期限於數據可用期限,產品列表僅限於在選定日期實際銷售的產品。然後,我們希望繪製一天中每個小時的總銷售額。

我將在下面列出一些代碼,其中也創建了一些示例數據。對不起,「長」的代碼。這是有點工作,但我有一些擔憂。

我的問題是:

1)我不知道以何種順序的東西,每次執行,特別是在第一次加載應用程序時,然後輸入的變化。同樣,數據取決於第一個輸入,第二個輸入取決於數據。第三,計算圖表友好的數據集,用於圖表。您可能會注意到錯誤信息會打印到控制檯(並在瀏覽器中短暫閃爍),但由於這些值可用,因此會進行更新並顯示圖。這似乎並不理想。

2)當輸入依賴於數據/服務器.R時,當前的最佳實踐是什麼?我看到這個https://groups.google.com/forum/?fromgroups=#!topic/shiny-discuss/JGJx5A3Ge-A,但它似乎沒有實現,甚至認爲這個帖子是相當老。

下面是兩個文件的代碼:

# ui.R 
###### 

library(shiny) 

shinyUI(pageWithSidebar(

    headerPanel("New Application"), 

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

    mainPanel(
    plotOutput("salesplot") 
) 

)) 

和:

#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

關於「谷歌小組討論」@WinstonChang最後一條消息中的一條說,提到的更改已經合併到版本'0.6.0'中。 IIRC,實際版本是'0.7.0',所以你應該可以使用它。至於第1點,我不能現在說,因爲我需要到我的Shiny環境。無論如何,您可以嘗試使用'cat'來跟蹤'server.R'的執行情況。 –

+0

你能解決這個問題嗎?我有同樣的問題。 –

回答

2

看起來這將一個很好的地方使用global.R。 global.R文件在ui.R和server.R之前讀取,因此您可以從全局訪問數據,從而可以訪問ui和服務器。