2013-08-19 4 views
15

In Shiny tutorial gibt ein Beispiel:Was ist der Unterschied zwischen reaktivem Wert und reaktivem Ausdruck?

fib <- function(n) ifelse(n<3, 1, fib(n-1)+fib(n-2)) 

shinyServer(function(input, output) { 
    currentFib   <- reactive({ fib(as.numeric(input$n)) }) 

    output$nthValue <- renderText({ currentFib() }) 
    output$nthValueInv <- renderText({ 1/currentFib() }) 
}) 

ich nicht, wie reactive die Werte zwischenspeichert. Tut es intern etwas wie return(function() cachedValue)? Jetzt frage ich mich, ob ich das tun kann?

fib <- function(n) ifelse(n<3, 1, fib(n-1)+fib(n-2)) 

shinyServer(function(input, output) { 
    currentFib   <- reactiveValues({ fib(as.numeric(input$n)) }) 

    output$nthValue <- renderText({ currentFib }) 
    output$nthValueInv <- renderText({ 1/currentFib }) 
}) 

Antwort

20

Mit currentFib <- reactiveValues({ fib(as.numeric(input$n)) }) wird in diesem Zusammenhang nicht. Sie erhalten eine Fehlermeldung, dass Sie auf reaktive Werte außerhalb des "reaktiven Kontexts" zugreifen.

jedoch, wenn Sie es in einem Funktionsaufruf statt wickeln, wird es funktionieren:

currentFib <- function(){ fib(as.numeric(input$n)) }

Dies funktioniert, weil jetzt der Funktionsaufruf in einem reaktiven Kontext ist.

Die Hauptunterschied ist die Unterscheidung, die sie in der Shiny documentation zwischen reaktiven "Quellen" und "Leiter" machen. In dieser Terminologie ist reactive({...}) ein Leiter, aber reactiveValues kann nur eine Quelle sein.

  • Hier ist, wie ich denke an reactiveValues - als eine Möglichkeit input auszudehnen, die in UI.R. angegeben wird Manchmal sind die Steckplätze in input nicht genug, und wir wollen abgeleitete Werte basierend auf diesen Eingabe-Steckplätzen. Mit anderen Worten, es ist eine Möglichkeit, die Liste der input Steckplätze für zukünftige reaktive Berechnungen zu erweitern.

  • Reactive() macht das, was Sie sagen - es gibt den Wert zurück, nachdem der Ausdruck jedes Mal erneut ausgeführt wird, wenn sich ein reaktiver Wert ändert. Wenn Sie sich den Quellcode sucht reactive können Sie es sehen: Die letzte Zeile ist, dass im Cache gespeicherten Wert, der zurückgegeben wird: Observable$new(fun, label)$getValue wo ‚Spaß‘ ist der Ausdruck, der in dem Aufruf von reactive.

gesendet wurde
Verwandte Themen