【问题标题】:What's the difference between Reactive Value and Reactive Expression?反应式价值和反应式表达有什么区别?
【发布时间】:2013-08-21 21:00:33
【问题描述】:

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

【问题讨论】:

    标签: r shiny


    【解决方案1】:

    使用 currentFib &lt;- reactiveValues({ fib(as.numeric(input$n)) }) 在这种情况下不起作用。 您将收到一条错误消息,指出您正在访问“反应式上下文”之外的反应式值。

    但是,如果您将其包装在函数调用中,它将起作用:

    currentFib &lt;- function(){ fib(as.numeric(input$n)) }

    这是可行的,因为现在函数调用位于响应式上下文中。

    关键区别是它们在Shiny documentation 中对反应性“源”和“导体”的区别。在该术语中,reactive({...})指挥,但reactiveValues 只能是来源

    • 这是我对 reactiveValues 的看法 - 作为扩展 input 的一种方式,它在 UI.R. 中指定 有时,input 中的插槽是不够的,我们想要基于这些输入槽的派生值。换句话说,它是一种扩展input 槽列表以供未来反应式计算的方法。

    • Reactive() 照你说的做——它返回值,在每次任何反应性值发生变化时重新运行表达式之后。如果你查看@987654331 的源代码@ 你可以看到: 最后一行是正在返回的缓存值:Observable$new(fun, label)$getValue 其中 'fun' 是在调用 reactive. 时发送的表达式

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-05-15
      • 2011-07-20
      • 2015-08-21
      • 1970-01-01
      • 1970-01-01
      • 2018-09-30
      • 2014-08-20
      • 2013-12-10
      相关资源
      最近更新 更多