Re: [問題] shiny 恢復上次結果
看板R_Language作者jackylikebmw (Tsai Chia Yu)時間7年前 (2018/03/25 15:24)推噓3(3推 0噓 0→)留言3則, 3人參與, 7年前最新討論串2/2 (看更多)
嗨,不好意思,一忙就忘記回應這篇文章了
我依照程式碼修改成可自動上傳一半的結果上去dropbox雲端的版本
我當初撰寫程式碼時也參考過以下兩個網址,給大家參考
https://daattali.com/shiny/persistent-data-storage/
https://shiny.rstudio.com/articles/persistent-data-storage.html
希望可以幫助到也擁有這個問題的版友們
---以下程式碼
library(shiny)
library(shinyjs)
library(DT)
library(rdrop2)
#example data
#write.csv(data.frame(x=c(1:5)+rnorm(5),y=c(5:1)+rnorm(5)),"thedata.csv",row.names
= F,fileEncoding = 'UTF-8')
ui <- fluidPage(
useShinyjs(),
# 載入讀取按鈕
actionButton("btn", "Continue?"),
# 使用者匯入資料
fileInput("userData", label="Your Data", multiple=T,
accept=c(".csv")),
# 第一個結果
DT::dataTableOutput("list1"),
# 使用者輸入值
numericInput("n", "wait n seconds", value=1),
actionButton("btn2", "confirm?"),
# 第二個結果
DT::dataTableOutput("list2"),
plotOutput("plotResult")
)
server <- shinyServer(function(input, output, session){
drop_auth(new_user = FALSE, key = "xxxxxxxxxxx",
secret = "xxxxxxxxxxx", cache = TRUE)
# 匯入使用者資料
getData <- reactive({
req(input$userData)
out <- read.csv(input$userData$datapath)
return(out)
})
# 第一個複雜的計算
calResult1 <- reactive({
#抓取檔案位置
file_name=drop_dir('yourapphere/data')
if(dim(file_name)[1]<1){
#因為之前沒資料,所以不顯示繼續按鈕
hide("btn")
d <- getData()
#假裝運算(第1次複雜運算)
Sys.sleep(10)
#上傳第一次處理結果
write.csv(d,"thedata.csv",row.names = F,fileEncoding
= 'UTF-8')
drop_upload("thedata.csv",path = "yourapphere/data")
#重新讀取一次dropbox,抓取確切位置
file_name_path
<<-drop_dir('yourapphere/data')$path_display
}else{
#因為之前有資料,所以不顯示上傳按鈕
hide("userData")
#按按鈕才讀取
req(input$btn)
#讀取dropbox檔案
file_name_path <<-file_name$path_display
d <- drop_read_csv(file_name_path,fileEncoding =
'UTF-8',stringsAsFactors = F)
}
out <- d
return(out)
})
# 顯示第一個結果
output$list1 <- DT:: renderDataTable(
datatable(calResult1())
)
# 第二個複雜的計算
calResult2 <- reactive({
d <-calResult1()
#假裝運算(第2次複雜運算)
req(input$btn2)
Sys.sleep(isolate(input$n))
out <- d[order(d$x),]
#記得,當結果出爐,記得刪除第一次處理的結果
drop_delete(file_name_path)
#關掉繼續及選擇時間按鈕
hide("n");hide("btn2")
return(out)
})
# 顯示第二個結果
output$list2 <- DT:: renderDataTable({
datatable(calResult2())
})
output$plotResult <- renderPlot({
d <- calResult2()
plot(x=d$x, y=d$y)
})
})
shinyApp(ui,server)
---
ps:記得去套用成自己的dropbox api、檔案位置也記得換
※ 引述《puppy77 ( )》之銘言:
: [問題類型]:
: 程式諮詢(我想用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)
: })
: })
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 114.40.155.25
※ 文章網址: https://www.ptt.cc/bbs/R_Language/M.1521991458.A.5D6.html
推
03/25 23:27,
7年前
, 1F
03/25 23:27, 1F
推
03/27 23:31,
7年前
, 2F
03/27 23:31, 2F
推
04/08 23:03,
7年前
, 3F
04/08 23:03, 3F
討論串 (同標題文章)
完整討論串 (本文為第 2 之 2 篇):
2
12
R_Language 近期熱門文章
PTT數位生活區 即時熱門文章