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

请参阅使用以下方法实现的相同example code:

  1. react 性的表达:

    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)
    

推荐答案

这里有一个trap ,尽管它不会在你的例子中发挥作用.

shiny个开发人员将reactive()设计为lazy,这意味着其中包含的表达式只有在其一个依赖项调用时才会执行.当它的一个react 依赖项发生更改时,它会清除缓存并通知自己的依赖项,但在其中一个依赖项发出请求之前,它本身不会执行.(比如说,如果它唯一的依赖项是隐藏选项卡上的textOutput()元素,那么除非打开该选项卡,否则它实际上不会被执行.)

另一方面,observe()eager;每当它的一个被动依赖项发生变化时,它所包含的表达式就会立即执行——即使它的任何依赖项都不需要它的值(事实上,即使没有依赖项).当你因其副作用而呼叫observe()时,这种渴望是desirable,但当你只使用它将其内容的返回值传递给后续的其他react 性表达式或端点时,这种渴望可能是wasteful.

Joe Cheng在2016年shiny 开发者大会上关于"有效的react 式编程"的演讲中很好地解释了这一区别,available here.特别是在演示文稿的second hour中,从30:20开始的部分.如果你一直看到40:42( blink 你就会错过!)他简要描述了你喜欢的observe()/reactiveValue ()组合的行为.

R相关问答推荐

如何将y轴设置为在ggplot 2中x=0处与x轴相交?

如何使用文本表达来子集数据

按自定义数字模式对变量名称排序

如何使用Cicerone指南了解R Shiny中传单 map 的元素?

基于不同组的列的相关性

修改用R编写的用户定义函数

R for循环返回到先前值

在R中将特定列的值向右移动

如何在Chart_Series()中更改轴值的 colored颜色 ?

如何在分组条形图中移动相关列?

仅 Select 超过9行的CSV文件

计算数据帧中指定值之前的行数,仅基于每行之后的future 行,单位为r

R如何计算现有行的总和以添加新的数据行

如何删除设置大小的曲线图并添加条形图顶部数字的百分比

当由base::限定时,`[.factor`引发NextMethod错误

有毒元素与表观遗传年龄的回归模型

如何在内联代码中添加额外的空格(R Markdown)

如何在Quarto中使用美人鱼图表中的标记来加粗文本

使用ggplot2绘制具有边缘分布的坡度图

如何获取R chromote中的当前URL?