我设置了一个闪亮的应用程序来检查GET字符串,并在存在与id
参数匹配的文件时显示链接。现在我想要做的是如果在URL中检测到有效查询,则将页面直接重定向到下载文件。有人知道要插入的语法,例如来自server.R的<meta http-equiv=...>
标题?
动机:我希望能够从指向Shiny应用程序的URL直接将文件下载到R控制台会话中。因此,一个非常讨厌的用户使用Shiny指定他们的初步统计模型,然后统计学家将其下载到他们通常的工作环境中并完成其余的工作。我需要在服务器端执行此操作,而不是像javascript的window.location
那样,因为客户端不支持javascript。
这是server.R
shinyServer(function(input, output, clientData) {
query <- reactive(parseQueryString(clientData$url_search));
revals <- reactiveValues();
## obtain ID from GET string
observe({revals$id <- query()$id});
## alternatively obtain ID from user input if any
observe({input$submitid; if(length(id<-isolate(input$manualid))>0) revals$id <- id;});
## update filename, path, and existance flag
observe({ revals$filename <- filename <- paste0(id<-revals$id,".rdata");
revals$filepath <- filepath <- paste0("backups/",filename);
revals$filexists <- file.exists(filepath)&&length(id)>0; });
## update download handler
output$download <- {downloadHandler(filename=function() revals$filename, content=function(oo) if(revals$filexists) system(sprintf('cp %s %s',revals$filepath,oo)))};
## render the download link (or message, or lack thereof)
output$link <- renderUI({
cat('writing link widget\n');
id<-revals$id;
if(length(id)==0) return(div(""));
if(revals$filexists) list(span('Session download link:'),downloadLink('download',id)) else {
span(paste0("File for id ",id," not found"));}});
});
这是ui.R
shinyUI(pageWithSidebar(
headerPanel(div("Banner Text"),"Page Name"),
sidebarPanel(),
mainPanel(
htmlOutput('link'),br(),br(),
span(textInput('manualid','Please type in the ID of the session you wish to retrieve:'),actionButton('submitid','Retrieve')))));
更新
在尝试@ jeff-allen的建议时,我遇到了另一个问题:如何提取复制文件的文件系统路径以便下载和将其转换为有效的URL?通过在我的本地主机上使用shell脚本和http配置设置可能是可能的,但是如何以便携方式执行此操作,不需要超级用户权限并尽可能保持原生状态?
答案 0 :(得分:4)
动机:我希望能够将文件直接下载到R中 来自指向Shiny app的URL的控制台会话。
...即。这相当于尝试从闪亮的应用程序提供静态内容的非常迂回的方式。事实证明,我根本不需要重定向或使用downloadHandler
。正如this post on the Shiny forum所述,我在本地www
目录中创建的任何文件都可以访问,就像它位于我的app目录的根目录一样。即如果我的应用程序执行save.image(file='www/foo.rdata')
,那么我将能够从[http://www.myhost.com/appname/foo.rdata]访问它,如果应用程序本身位于[http:// www。 myhost.com/appname /