r - R Shiny 仅观察到特定的 reactiveVal 变化
问题描述
是否可以observe
仅在特定reactiveVal
更改时触发功能?
在我的全代码交叉引用模块中,带有反应和观察者,我有一些东西可以归结为以下玩具示例:
library(shiny)
shinyApp(
fluidPage(
textInput('i1', 'Input 1'),
textInput('i2', 'Input 2'),
textInput('out', 'Output (do not edit)')
),
function(input, output, session) {
observe({ print(input$i2); updateTextInput(session, 'out', value = input$i1) })
observe({ print(input$i1); updateTextInput(session, 'out', value = input$i2) })
}
)
请注意,如果没有 print 语句,代码将按照我希望的方式工作。但是,如果两个观察者都使用这两个输入,则两个都按顺序触发,并且仅input$i2
来自第二个观察者的触发被放入我的out
textInput 中。
有什么方法可以告诉闪亮我只希望第一个observe
在input$i1
更改时运行,而第二个observe
在更改时运行input$i2
?
编辑
事实证明,您可以只使用observeEvent
输入来区分它们。但是,在一个现在更加复杂的示例中,我无法使用observeEvent
on reactiveVal
- 在这种情况下,它根本不会触发。同样,下面的示例在没有 print 语句的情况下工作,但是两个观察者都会触发。
有没有办法观察 a 的变化reactiveVal
?
library(shiny)
shinyApp(
fluidPage(
textInput('i1', 'Make uppercase'),
textInput('i2', 'Make lowercase'),
textInput('out', 'Output (ideally not editable)')
),
function(input, output, session) {
i1 <- reactiveVal('')
i2 <- reactiveVal('')
observeEvent(input$i1, { i1(toupper(input$i1)) })
observeEvent(input$i2, { i2(tolower(input$i2)) })
observe({ print(i2()); updateTextInput(session, 'out', value = i1()) })
observe({ print(i1()); updateTextInput(session, 'out', value = i2()) })
}
)
解决方案
observeEvent
确实适用于任何反应式上下文,这是它如何使用的示例reactiveVal
library(shiny)
shinyApp(
fluidPage(
textInput('i1', 'Make uppercase'),
textInput('i2', 'Make lowercase'),
textInput('out', 'Output (ideally not editable)')
),
function(input, output, session) {
i1 <- reactiveVal('')
i2 <- reactiveVal('')
observeEvent(input$i1, { i1(toupper(input$i1)) })
observeEvent(input$i2, { i2(tolower(input$i2)) })
observeEvent(i1(), {print(i2()); updateTextInput(session, 'out', value = i1()) })
observeEvent(i2(), {print(i1()); updateTextInput(session, 'out', value = i2()) })
}
)
推荐阅读
- javascript - 使用特定模式时忽略流类型错误
- amazon-web-services - AWS cost explorer 如何按计费标签计算 EC2 实例的报告?
- php - 向 vscode 添加外部库
- postgresql-11 - 将新表引用为触发器函数 Postgresql 不可见的 new_table
- c# - 是否可以使用 iText 创建 Excel 文件
- mysql - MySQL 从 5.1.11 升级到 5.1.72
- here-api - 具有产品风格的 Android SDK 身份验证
- jira - 错误:启用 JIRA 扩展后索引超出范围(问题跟踪器)
- c# - 当 PC/MAC 上的应用程序窗口大小发生变化时,如何获得通知?
- groovy - 如何在项目的soap ui中使用groovy创建摘要报告