作者johnsonla (johnson)
看板R_Language
标题Re: [问题] Shiny 套件请益
时间Fri Apr 19 01:51:30 2013
※ 引述《acecc (cc)》之铭言:
: [问题类型]:
: 程式谘询(我想用R 做某件事情,但是我不知道要怎麽用R 写出来)
: [软体熟悉度]:
: R的基本使用没问题,但使用Shiny套件是完全的新手...
: 先写个基本款来试试看...
: [问题叙述]:
: 程式做的事情很单纯,
: 1. upload 一个档案
: 2. 程式对每个Column做简单的线性预测
: 3. 将结果download下来
: 程式我有丢上Glimmer Server
: http://glimmer.rstudio.com/glen/Pred/
: 并附上一个简易的测试档案,可以用此档案直接upload,并算出结果。
: https://www.asuswebstorage.com/navigate/s/14B96034DC784748976F45174C9F274BY
: 但我有三个技术上的问题想克服,请教各位~
: 1. 若同时间此程式有好几个人同时使用,那麽很有可能会download到别人的output.
: 例如:A先跑完但还没做download的动作,此时B也上传了另一个档案跑了另一个output出来
: 那麽这时候A 与 B去download档案的时候,就都会download到B产生的output
: 请问我要怎麽能让每个End user都能下载到自己产生的output?
: 这是server端的问题,还是我程式写法的问题?
我的解决办法是每次使用者开启网页就随机生成一个暂存档(tempRD1),
然後把资料写到暂存档里面(run datasetInput时顺便写入),
当使用者要下载时再从暂存档里面抓(readRDS(tempRD1))。
大概可以经由以下code实践 (未经测试 汗 = =")
shinyServer(function(input, output) {
...
tempRD1 <- paste(tempfile(), ".RData", sep="")
datasetInput <- reactive({
out <- switch(input$dataset, "FIT" = fit)
saveRDS(out, tempRD1)
out
})
output$downloadData <- downloadHandler(
filename = function() { paste(input$dataset, '.csv', sep='') },
content = function(file) {
out <- readRDS(tempRD1)
write.csv(out, file)
}
)
})
: 2. 请教一下有没有办法让流程缩短为
: a. upload 一个档案
: b. 程式对每个Column做简单的线性预测且自动跳出结果问你要不要download
: 而不用让End user再去点download?
: Shiny套件能做到这个效果吗?
就我对Shiny 0.4.0的印象,没有这个预设功能,
不过这样的效果还是做得到(颇麻烦),我想大概的流程如下:
1. 判断程式甚麽时候跑完
2. 利用conditionalPanel(), 当程式跑完跳出一个yes/no box
(note: Shiny 目前没有yes/no box, 你会用到javascript: confirm())
: 3. 有没有办法让程式跑完自动将结果寄到指定的的E mail信箱而不用手动下载。
那你还是要先填email地址啊...
你是想要多一个栏位填email,然後按下发送键这样?
你可能需要这两个套件: {sendmailR} and {shinyIncubator}
然後利用sendmail() + actionBotion() 完成你要的效果
: [程式范例]:
: 因为有两段程式码,我就直接贴在这儿了!
: #######ui.R
: library(shiny)
: shinyUI(pageWithSidebar(
: headerPanel("Hello!"),
: sidebarPanel(
: fileInput('file1', 'Input Data',
: accept=c('text/csv', 'text/comma-separated-values,text/plain')),
: tags$hr(),
: selectInput("dataset", "Download:",
: choices = "FIT"),
: downloadButton('downloadData', 'Download')),
: mainPanel(
: tableOutput("contents")
: )
: ))
: #######server.R
: library(shiny)
: shinyServer(function(input, output) {
: output$contents <- renderTable({
: inFile <- input$file1
: if (is.null(inFile))
: return(NULL)
: y <- read.csv(inFile$data, header= TRUE)
: data <- apply(y, 2, cumsum)
: fit <<- apply(data, 2, function(z){
: z <- z[!is.na(z)]
: x <- 1:length(z)
: tempfit <- lm(z[-(1:6)] ~ x[-(1:6)])
: coef(tempfit)[1] + coef(tempfit)[2] * 1:70
: })
: fit
: })
: #browser()
: datasetInput <- reactive({
: switch(input$dataset,
: "FIT" = fit)
: })
: output$table <- renderTable({
: datasetInput()
: })
: output$downloadData <- downloadHandler(
: filename = function() { paste(input$dataset, '.csv', sep='') },
: content = function(file) {
: write.csv(datasetInput(), file)
: }
: )
: })
: 有任何不清楚的地方麻烦再告诉我
: 感谢各位!
My Shiny app:
http://glimmer.rstudio.com/tchsieh/inext/
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 220.135.249.109
1F:推 Wush978:强 04/19 02:02
2F:推 ljta:强 04/19 17:10
3F:→ acecc:强 04/20 21:54
4F:→ acecc:但第一个问题 我用您的方式改会变成档案无法下载 04/20 21:55
5F:→ acecc:而且小弟太弱一直找不出问题在哪 04/20 21:56
6F:→ johnsonla:要把saveRDS(fit, tempRD1)放在output$contents里面才对 04/23 21:16