【问题标题】:Isolating reactive expression隔离反应式表达
【发布时间】:2017-06-05 07:11:02
【问题描述】:

我想为 someobserveEvent 调用一个特定的反应式表达式,并为其他 observeEvent 隔离它。下面我有我想要实现的最少代码(我的实际应用程序包含许多 observeEventcalling 反应式表达式)。

library(shiny)

ui <- fluidPage(

  numericInput("Num1", "First number:", 0),

  numericInput("Num2", "Second number:", 0),

  textOutput("Answer"),

  actionButton("Button_1", "Call reactive"),

  actionButton("Button_2", "Don't Call reactive")

)

server <- function(input, output){

  Ans <- reactive({
    a <-input$Num1 + input$Num2
    a
  })

  observeEvent(input$Button_1, {

    output$Answer <- renderText({Ans()})

  })

  observeEvent(input$Button_2, {

    output$Answer <- renderText({isolate(Ans())})

  })

}


shinyApp(ui = ui, server = server)

在上面的应用程序中,我有两个actionButtonsButton_1(呼叫反应)和Button_2(不呼叫反应)。正如标签为第一个按钮 (Button_1) 建议的那样,我希望每次单击按钮时都调用响应式表达式,但对于第二个按钮 (Button_2),我希望不调用响应式表达式(即使输入变化)。为了防止Button_2 表单调用反应式表达式,我添加了isolate,但这并不妨碍调用反应式表达式。

有没有什么方法可以在输入发生变化时隔离反应式表达式?

【问题讨论】:

  • 我不清楚单击Button_2 时会发生什么。如果你只是不需要看到新的值,为什么不把这行代码注释掉呢?
  • @amatsuo_net 在我的实际应用程序中我使用了两个observeEvent,第一个是绘制绘图,第二个是缩放现有绘图。因此,对于缩放按钮,我不希望再次计算反应表达式。在这里,我只是想让示例尽可能地少。也许我应该编辑我的代码,以便清楚为什么我需要两个observeEvent,一个重新计算反应表达式,一个不重新计算。

标签: r reactive-programming shiny


【解决方案1】:

你可以使用?eventReactive()

所以将reactive()函数替换为

  Ans <- eventReactive(input$Button_1,{
    input$Num1 + input$Num2
  })

(那你也可以去掉isolate()函数)。

正如您提到的,您有多个 observeEvent() 并且可能还有更多条件,值得一提的是,它也适用于多个条件:

  Ans <- eventReactive({input$Button_1;input$Button_2;...},{
    input$Num1 + input$Num2
  })

【讨论】:

  • 完美运行。已经读过这篇文章,但到目前为止从未在任何应用程序中使用过它(我猜没有意识到它的潜力)。它解决的不仅仅是我在应用程序中遇到的这个问题。非常感谢!
猜你喜欢
  • 2019-11-30
  • 2018-08-24
  • 1970-01-01
  • 2022-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-23
相关资源
最近更新 更多