22

Shiny チュートリアルには、例があります。

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

1 に答える 1

26

を使用して currentFib <- reactiveValues({ fib(as.numeric(input$n)) })も、このコンテキストでは機能しません。「リアクティブ コンテキスト」外のリアクティブ値にアクセスしていることを示すエラーが表示されます。

ただし、代わりに関数呼び出し内にラップすると、機能します。

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

これが機能するのは、関数呼び出しがリアクティブ コンテキスト内にあるためです。

な違いは、Shiny のドキュメントで、リアクティブな「ソース」と「コンダクター」を区別していることです。その用語でreactive({...})は、 は導体ですが、ソースreactiveValuesになることしかできません。

  • これが私が考える方法です-UI.Rで指定さreactiveValuesれる拡張方法として。のスロットが十分でなく、それらの入力スロットに基づいて派生した値が必要な場合があります。つまり、将来のリアクティブ計算のためにスロットのリストを拡張する方法です。inputinputinput

  • Reactive()あなたが言うことを行います-リアクティブな値が変更されるたびに式を再実行した後、値を返します。ソース コードをreactive見ると、それがわかります: 最後の行は、キャッシュされた値が返されています:Observable$new(fun, label)$getValueここで、'fun' は、への呼び出しで送信された式です。reactive.

于 2013-08-20T07:22:35.150 に答える