如何立即制作闪亮的重定向?

时间:2013-09-24 13:04:59

标签: r redirect http-redirect url-redirection shiny

我设置了一个闪亮的应用程序来检查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配置设置可能是可能的,但是如何以便携方式执行此操作,不需要超级用户权限并尽可能保持原生状态?

1 个答案:

答案 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 /