2015-07-21 21 views
6

Ich würde gerne wissen, ob es möglich ist, eine kontinuierliche Hintergrundaufgabe zu behalten, während ich eine Shiny-App laufen lasse. Das bedeutet beispielsweise, dass ein "thread" Daten von einer Webseite in eine Datenbank herunterladen kann, während shinyApp läuft.R Shiny - Kontinuierliche Hintergrundaufgabe

Noch mehr, könnte es möglich sein, mit den Daten aus dem externen Hintergrund "thread" zu interagieren? (z. B. während es heruntergeladen wird, mach eine Handlung oder etwas).

Im Video-Tutorial heißt es: "Code außerhalb der Server-Funktion wird einmal pro R-Sitzung (Worker) ausgeführt". Also, der Code, den ich brauche, denke ich sollte außerhalb der Serverfunktion platziert werden.

Kann ich die Szene, die ich beschreibe, erreichen? Oder brauche ich eine andere externe R-Instanz (außerhalb der ShineApp-Skripte)?

Vielen Dank im Voraus.

Antwort

1

Ich habe darüber nachgedacht, und ich denke, es ist möglich, aber die Implementierung, die ich im Sinn habe, ist plattformspezifisch. In diesem Fall nehme ich ubuntu 14.04 an.

Lassen Sie uns sagen Sie einige rechenintensive Aufgabe haben:

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)) 
    }) 
} 

wandern die Operation in Abhängigkeit der relevanten Variablen in ein Unterdatei:

newfile.R

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

Änderung Ihres 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] 
    }) 


} 

Dies ist immer noch ein wenig fehlerhaft, aber es ist Proof of Concept, dass Sie intensive Operationen auf Unter rprocesses bewegen können, und haben einen reaktiver Zuhörer erkennen, wenn diejenigen, Berechnungen sind abgeschlossen.

EDIT: Shiny wird auch Berechtigungen benötigen, um an den relevanten Ort zu schreiben.