![](/img/trans.png)
[英]How to replace reactive with reactiveVal and ObserveEvent in R Shiny
[英]R Shiny observe only a specific reactiveVal change
只有当特定的reactiveVal
发生变化时, observe
函数才可能触发吗?
在我的带有反应和观察者的全代码交叉引用模块中,我有一些东西可以归结为以下玩具示例:
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) })
}
)
请注意,如果没有打印语句,代码将按照我希望的方式工作。 但是,如果两个观察者都使用两个输入,那么两个观察者都会顺序触发,并且只有来自第二个观察者的input$i2
被放入我的out
textInput 中。
有什么方法可以让我告诉闪亮,我只希望第一个observe
在input$i1
更改时运行,而第二个observe
在input$i2
更改时运行?
原来你可以在输入上使用observeEvent
来区分它们。 然而,在现在比较绕口例子,我不能够使用observeEvent
上reactiveVal
-在它不火,在所有的情况下。 同样,下面的示例在没有打印语句的情况下工作,但是两个观察者都会触发。
有没有一种方法来观察一个变化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(i1()); updateTextInput(session, 'out', value = i1()) })
observeEvent(i2(), {print(i2()); updateTextInput(session, 'out', value = i2()) })
}
)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.