3

idGET 文字列をチェックし、引数に一致するファイルが存在する場合はリンクを表示する光沢のあるアプリをセットアップしました。ここで、URL で有効なクエリが検出された場合に、ページをダウンロード ファイルに直接リダイレクトさせたいと考えています。<meta http-equiv=...>server.Rのヘッダーなど、挿入する構文を知っている人はいますか?

動機: Shiny アプリを指す URL から R コンソール セッションにファイルを直接ダウンロードできるようにしたいと考えています。そのため、オタクではないユーザーが Shiny を使用して予備的な統計モデルを指定し、統計学者がそれを通常の作業環境にダウンロードして、残りの方法で使用します。window.locationJavaScriptはクライアント側でサポートされないため、JavaScriptのようなものではなく、サーバー側でこれを行う必要があります。

ここにサーバーがあります.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 に変換するにはどうすればよいですか? ローカル ホストのシェル スクリプトと http 構成設定を台無しにすることでおそらく可能ですが、スーパーユーザー権限を必要とせず、可能な限り光沢のあるネイティブなポータブルな方法でこれを行うにはどうすればよいでしょうか?

4

1 に答える 1