2015-08-09 14 views
5

Ich habe den folgenden Code in server.R:R Shiny: Reuse lange Berechnung für verschiedene Ausgabe Kontrollen

library(shiny) 

source("helpers.R") 

shinyServer(function(input, output) { 
    output$txtOutput1 <- renderText({ 
     someLengthyComputation(input$txtInput)[1] 
    }) 
    output$txtOutput2 <- renderText({ 
     someLengthyComputation(input$txtInput)[2] 
    }) 
    output$txtOutput3 <- renderText({ 
     someLengthyComputation(input$txtInput)[3] 
    }) 
}) 

helpers.R enthält die Methode someLengthyComputation, die einen Vektor der Größe zurück 3. Wie kann ich umgehen Aufruf es dreimal jedes Mal txtInput ändert und nur einmal aufrufen, während alle drei Text-Ausgabe-Steuerelemente aktualisieren?

Antwort

5

können Sie einfach platzieren someLengthyComputation in einem reactive Ausdruck:

shinyServer(function(input, output) { 
    someExpensiveValue <- reactive({ 
     someLengthyComputation(input$txtInput) 
    }) 

    output$txtOutput1 <- renderText({ 
     someExpensiveValue()[1] 
    }) 

    output$txtOutput2 <- renderText({ 
     someExpensiveValue()[2] 
    }) 

    output$txtOutput3 <- renderText({ 
     someExpensiveValue()[3] 
    }) 
}) 

someLengthyComputation wird nur dann ausgelöst werden, wenn input$txtInput Änderungen und die erste der Ausgänge sonst gemacht wird someExpensiveValue wird eine zwischengespeicherte Wert zurück. Es ist auch möglich, obwohl die Ausführungsstrategie etwas anders ist, eine Kombination von reactiveValues und observe zu verwenden.

Wenn someLengthyComputation ist wirklich teuer man beachten sollte, nur eine action button oder eine submit button und die Auslösung der Berechnungen addiert, wenn es angeklickt wird, vor allem wenn man textInput verwenden.