[問題] shiny 恢復上次結果

作者: puppy77 ( )   2018-02-18 21:37:01
[問題類型]:
程式諮詢(我想用R 做某件事情,但是我不知道要怎麼用R 寫出來)
[軟體熟悉度]:
入門(寫過其他程式,只是對語法不熟悉)
[問題敘述]:
我寫了一個網頁,主要功能是使用者匯入他的data
網頁會使用匯入的data做複雜的運算後顯示出第一個結果
使用者檢視過這個結果後再input一些值
網頁再依第一個結果搭上這次的input的值做另一個複雜的運算
最後再顯示出第二個結果及畫圖
因使用者看過第一個結果後會需要時間決定之後要input的值 可能是隔幾天
又加上運算實在花很多時間
(我已經很努力修改程式減少運算時間,但還是很久....Orz)
所以希望能夠在使用者下一次打開網頁後能夠恢復到他上次關掉的狀態
有考慮過把所有的計算結果全部都匯出下次再匯入
但因為這樣要匯出很多東西 又要再匯入很多東西(下面程式是簡化過的)
所以不知道是否能有其他更好的選擇
又若真的必須把所有結果一一匯出的話
匯入的部分會建議從哪個步驟匯入??
譬如下面程式第一個計算結果
把匯入寫在calResult1內或是output$list1內比較好??
[程式範例]:
ui <- fluidPage(
# 使用者匯入資料
fileInput("userData", label="Your Data", multiple=T, accept=c(".csv")),
# 第一個結果
DT::dataTableOutput("list1"),
# 使用者輸入值
numericInput("n", "N", value=1),
# 第二個結果
DT::dataTableOutput("list2"),
plotOutput("plotResult")
)
server <- shinyServer(function(input, output, session){
# 匯入使用者資料
getData <- reactive({
req(input$userData)
out <- read.csv(input$userData$datapath)
return(out)
})
# 第一個複雜的計算
calResult1 <- reactive({
d <- getData()
out <- complicatedFunction1(d)
return(out)
})
# 顯示第一個結果
output$list1 <- DT:: renderDataTable(
datatable(calResult1())
)
# 第二個複雜的計算
calResult2 <- reactive({
d <- calResult1()
out <- complicatedFunction2(d, input$n)
return(out)
})
# 顯示第二個結果
output$list2 <- DT:: renderDataTable(
datatable(calResult2())
)
output$plotResult <- renderPlot({
d <- calResult2()
plot(x=d$x, y=d$y)
})
})
作者: cywhale (cywhale)   2018-02-19 12:18:00
可以讓使用者下載calResult1()結果比如存在rds or RData同時也讓使用者可以匯回上次的下載檔..程式裡判斷第二計算資料來源是從上傳檔案或計算而得即可
作者: puppy77 ( )   2018-02-20 22:00:00
看起來是只能一個一個匯出再匯入了....謝謝
作者: cywhale (cywhale)   2018-02-20 22:31:00
使用者可能不必知道他存出、匯入的物件是什麼,用save存RData供匯出,就可一次把要存的資料做完不用一個個匯吧
作者: jackylikebmw (Tsai Chia Yu)   2018-02-22 07:29:00
我有遇到類似問題歐,我是把資料存到Dropbox,程式下次啟動時會先讀Dropbox,如果使用者選擇重新,就會刪除檔案,選擇繼續,就會下載Dropbox的資料繼續跑這樣子對使用者的體驗比較好,看你要不要玩shinyBS,在程式啟動前先跳要不要繼續的指令
作者: puppy77 ( )   2018-02-22 23:00:00
謝謝兩位 我再試試看 另外可以請j大分享一下程式嗎??

Links booklink

Contact Us: admin [ a t ] ucptt.com