2013-08-19 59 views
15

Shiny tutorial,有一個例子:反應性值與反應性表達式有什麼區別?

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

我不明白怎麼reactive緩存值。它是否在內部執行類似return(function() cachedValue)的操作? 現在我想知道我能否做到這一點?

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

回答

20

使用 currentFib <- reactiveValues({ fib(as.numeric(input$n)) })不會在這方面的工作。 您將收到一條錯誤消息,說您正在訪問「被動環境」以外的被動值。

但是,如果你把它包裝一個函數調用,而不是裏面,它會工作:

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

這工作,因爲現在的函數調用是一種反應性上下文中。

關鍵區別是它們在Shiny documentation中在被動「源」和「導體」之間所作的區別。在該術語中,reactive({...})導體,但reactiveValues只能是

  • 這是我怎麼想的reactiveValues - 作爲一種擴展input其獲取UI.R.規定有時候,input中的插槽是不夠的,我們希望根據這些輸入插槽導出值。換句話說,這是一種擴展input時隙列表以用於將來的反應計算的方法。

  • Reactive()按照你所說的 - 每次任何被動值改變時重新運行表達式後返回值如果你看一下源代碼reactive你可以看到它: 最後一行是正被返回緩存值:Observable$new(fun, label)$getValue其中「有趣」的是,在呼叫發送到reactive.

表達
相關問題