1. ホーム
  2. r

[解決済み] R Shiny: reactiveValuesとreactiveの比較

2023-06-02 20:54:33

質問

この質問は この質問 . この2つは同じ機能を生成することができますが、実装は若干異なっています。大きな違いのひとつは reactiveValue のように複数の値を持つことができるコンテナであることです。 input$ . で 光沢のあるドキュメント の機能は、通常 reactive() で実装されていますが、ほとんどの場合、私は reactiveValues() の方が便利です。何か不都合があるのでしょうか?この2つの間には、私が知らないような大きな違いがあるのでしょうか? この2つのコードスニペットは同等ですか?

同じ のコード例 を使って実装されています。

  1. 反応式。

    library(shiny)
    
    ui <- fluidPage( 
      shiny::numericInput(inputId = 'n',label = 'n',value = 2),
      shiny::textOutput('nthValue'),
      shiny::textOutput('nthValueInv')   
    )
    
    fib <- function(n) ifelse(n<3, 1, fib(n-1)+fib(n-2))
    
    server<-shinyServer(function(input, output, session) {   
      currentFib         <- reactive({ fib(as.numeric(input$n)) })  
      output$nthValue    <- renderText({ currentFib() })
      output$nthValueInv <- renderText({ 1 / currentFib() })   
    })
    
    shinyApp(ui = ui, server = server)
    
    
  2. リアクティブな値です。

    library(shiny)
    
    ui <- fluidPage( 
      shiny::numericInput(inputId = 'n',label = 'n',value = 2),
      shiny::textOutput('nthValue'),
      shiny::textOutput('nthValueInv')  
    )
    
    fib <- function(n) ifelse(n<3, 1, fib(n-1)+fib(n-2))
    
    server<-shinyServer(function(input, output, session) { 
      myReactives <- reactiveValues()  
      observe(  myReactives$currentFib <-  fib(as.numeric(input$n))  ) 
      output$nthValue    <- renderText({ myReactives$currentFib  })
      output$nthValueInv <- renderText({ 1 / myReactives$currentFib  }) 
    })
    
    shinyApp(ui = ui, server = server)
    
    

どのように解決するのですか?

この例では登場しませんが、キャッチがあります。

その 光沢のある 開発者が設計した reactive() であるように 怠け者 つまり、その中に含まれる式は、その依存関係のいずれかによって呼び出されたときにのみ実行されます。その反応依存性の一つが変更されたとき、それはキャッシュをクリアし、それ自身の依存性を通知しますが、それらの依存性の一つによって要求されるまで、それ自身は実行されません。(ですから、例えば、その唯一の依存関係が textOutput() 要素である場合、そのタブが開かれない限り、そして開かれるまでは、実際には実行されません)。

observe() は、一方では 熱心 であり、この式が含む式は、その反応依存性の一つが変更されるとすぐに実行されます -- たとえその値が依存性のどれにも必要とされないとしても(実際 がない場合でも)。このような熱心さは 望ましい を呼び出しているときに observe() を呼び出す場合は、その副作用のために 無駄 しかし、その内容の戻り値を他の反応式やエンドポイントに渡すためだけに使っている場合は、となる可能性があります。

Joe Cheng は、2016 年の Shiny Developer Conference での "Effective reactive programming" に関するプレゼンテーションで、この区別を非常にうまく説明しています。 ここで利用可能 . 特に、プレゼンテーションの 30:20 あたりから始まる部分をご覧ください。 2時間目 . 40:42まで見ると(まばたきすると見逃しますよ!)、彼は簡単に observe() / reactiveValue () の組み合わせで、お好みのものをお選びください。