[问题] 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