R闪亮:反应值与反应值 [英] R Shiny: reactiveValues vs reactive

查看:19
本文介绍了R闪亮:反应值与反应值的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

此问题与this one相关。两者可以生成相同的功能,但实现略有不同。一个重要的区别是reactiveValue是一个可以有多个值的容器,如input$。在shiny documentation中,功能通常使用reactive()实现,但在大多数情况下,我发现reactiveValues()更方便。这里有捕获物吗?这两者之间还有什么我可能不知道的主要区别吗?这两个代码段等效吗?

查看使用:

实现的相同example code
  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. a反应值:

    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闪亮开发人员大会演示文稿available here中很好地解释了这一区别。请特别参阅演示文稿second hour中30:20左右开始的部分。如果你看到40:42(一眨眼你就看不到了!)他简要描述了您喜欢的observe()/reactiveValue ()组合的行为。

这篇关于R闪亮:反应值与反应值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆