Как сделать перенаправление Shiny сразу?

Я настроил блестящее приложение, которое проверяет строку GET и предоставляет ссылку, если файл, соответствующий аргументу id, существует. Теперь я хотел бы сделать так, чтобы страница перенаправлялась прямо на файл загрузки, если в URL-адресе обнаружен действительный запрос. Кто-нибудь знает синтаксис для вставки, например. заголовок <meta http-equiv=...> с server.R?

Мотивация: я хочу иметь возможность загружать файлы непосредственно в сеанс консоли R с URL-адреса, указывающего на приложение Shiny. Итак, неопытный пользователь задает свою предварительную статистическую модель с помощью Shiny, затем статистик загружает ее в свою обычную рабочую среду и доводит до конца. Мне нужно сделать это на стороне сервера, а не с чем-то вроде window.location javascript, потому что 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-конфигурации на моем локальном хосте, но как сделать это переносимым способом, который не требует привилегий суперпользователя и является настолько блестящим, насколько это возможно?


person bokov    schedule 24.09.2013    source источник
comment
Вы можете использовать tag() для вставки произвольных тегов HTML в ваш пользовательский интерфейс (например, meta). Если ваш тег необходимо сгенерировать на стороне сервера, вы можете использовать dynamicUI() для передачи элементов пользовательского интерфейса, сгенерированных на сервере, в пользовательский интерфейс.   -  person Jeff Allen    schedule 24.09.2013


Ответы (1)


Мотивация: я хочу иметь возможность загружать файлы непосредственно в сеанс консоли R с URL-адреса, указывающего на приложение Shiny.

... т.е. это равносильно очень окольному способу попытки обслуживать статический контент из блестящего приложения. Оказывается, мне вообще не нужно перенаправлять или использовать downloadHandler. Как говорится в этом сообщении на форуме Shiny, любой файл, который я создаю, внутри локального каталога www будет доступен, как если бы он находился в корне каталога моего приложения. т.е. если мое приложение выполняет save.image(file='www/foo.rdata'), то я смогу получить к нему доступ с [http://www.myhost.com/appname/foo.rdata], если само приложение находится по адресу [http://www.myhost.com/ Название приложения/]

person bokov    schedule 25.09.2013