R闪亮:反应值与反应值 [英] R Shiny: reactiveValues vs reactive
本文介绍了R闪亮:反应值与反应值的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
此问题与this one相关。两者可以生成相同的功能,但实现略有不同。一个重要的区别是reactiveValue
是一个可以有多个值的容器,如input$
。在shiny documentation中,功能通常使用reactive()
实现,但在大多数情况下,我发现reactiveValues()
更方便。这里有捕获物吗?这两者之间还有什么我可能不知道的主要区别吗?这两个代码段等效吗?
查看使用:
实现的相同example code反应性表达式:
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)
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()
以了解其副作用时,这种渴望是可取的,但是当您仅使用它将其内容的返回值传递给其他反应式或终结点时,它可能是浪费的。
observe()
/reactiveValue ()
组合的行为。
这篇关于R闪亮:反应值与反应值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文