2015-07-21 15 views
6

Vorrei sapere se è possibile mantenere un'attività in background durante l'esecuzione di un'app Shiny. Ciò significa, ad esempio, che una "discussione" potrebbe essere il download di dati da una pagina Web a un database mentre lucidoApp è in esecuzione.R Lucido - Attività in background continua

Ancora più, potrebbe essere possibile interagire con i dati dallo sfondo esterno "thread"? (Ad esempio, mentre viene scaricato, crea una trama o qualcosa del genere).

Nel tutorial video, si dice che: "Il codice esterno alla funzione server verrà eseguito una volta per sessione R (worker)". Quindi, il codice di cui ho bisogno dovrebbe essere collocato al di fuori della funzione del server.

È possibile ottenere la scena che descrivo? O ho bisogno di un'altra istanza R esterna (al di fuori degli script shinyApp)?

Grazie in anticipo.

risposta

1

Stavo pensando a questo, e penso che sia possibile, ma l'implementazione che ho in mente è specifica della piattaforma. In questo caso, assumerò ubuntu 14.04.

Diciamo che avete un po 'computazionalmente intensive compito:

ui.R:

library(shiny) 
fluidPage(
    numericInput('number','Number',10000000), 
    textOutput('CalcOutput') 
) 

server.R

library(shiny) 
function(input,output,session) { 
    output$CalcOutput <- renderText({ 
    sort(runif(input$number)) 
    }) 
} 

migrare l'operazione ad una funzione delle variabili rilevanti in un subfile:

newfile.R

saveRDS(sort(runif(commandArgs(TRUE)[1])), file = 'LargeComputationOutput') 

cambiare la vostra server.R

function(input, output) { 
    observe({ 
    # Starts script as a background process, but completes instantaneously 
    system(paste('Rscript newfile.R',input$number,'&')) 
    }) 

    CalculationOutput <- reactive({ 
    invalidateLater(5000) 
    validate(
     need(file.exists('LargeComputationOutput'),'Calculation In Progress'), 
     need(file.info('LargeComputationOutput')$mtime > Sys.time()-5,'Calculation In Progress') 
    ) 
    x <- readRDS('LargeComputationOutput') 
    }) 

    output$CalcOutput <- renderText({ 
    CalculationOutput()[300] 
    }) 


} 

Questo è ancora un po 'buggy, ma è prova di concetto, che è possibile spostare le operazioni intensive di sub-rprocesses, e hanno un ascoltatore reattiva rilevare quando quelli i calcoli sono fatti

EDIT: Shiny richiede anche le autorizzazioni per scrivere nella posizione pertinente.