Я настроил блестящее приложение, которое проверяет строку 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-конфигурации на моем локальном хосте, но как сделать это переносимым способом, который не требует привилегий суперпользователя и является настолько блестящим, насколько это возможно?
tag()
для вставки произвольных тегов HTML в ваш пользовательский интерфейс (например,meta
). Если ваш тег необходимо сгенерировать на стороне сервера, вы можете использоватьdynamicUI()
для передачи элементов пользовательского интерфейса, сгенерированных на сервере, в пользовательский интерфейс. - person Jeff Allen   schedule 24.09.2013