如何在 Shiny observeEvent 中监听多个事件表达式
How to listen for more than one event expression within a Shiny observeEvent
我想要两个不同的事件来触发观察者。有人建议 这应该有效。不过好像只依赖于第二个事件
observeEvent({
input$spec_button
mainplot.click$click
}, { ... } )
看看这个例子。
ui <- shinyUI(bootstrapPage(
actionButton("test1", "test1"),
actionButton("test2", "test2"))
)
server <- shinyServer(function(input, output) {
observeEvent({
input$test1
input$test2
}, {
print('Hello World')
})
})
shinyApp(ui, server)
单击按钮 test1 后没有任何反应。如果您单击按钮 test2,它会打印到您的控制台。按下 test2 按钮后,单击 test1 将打印消息。这是一种奇怪的行为。
link 中的另一个建议是使用
list(input$test1, input$test2)
即使不单击按钮也会打印消息。
应该这样做,请注意,您仍然需要检查按钮是否被点击,如@MrFlick 所述
1。您可以使用反应式表达式
#rm(list = ls())
library(shiny)
ui <- shinyUI(bootstrapPage(
actionButton("test1", "test1"),
actionButton("test2", "test2"))
)
server <- shinyServer(function(input, output) {
toListen <- reactive({
list(input$test1,input$test2)
})
observeEvent(toListen(), {
if(input$test1==0 && input$test2==0){
return()
}
print('Hello World')
})
})
shinyApp(ui, server)
2。根据@MrFlick 给出的示例(现已删除)
#rm(list = ls())
library(shiny)
ui <- shinyUI(bootstrapPage(
actionButton("test1", "test1"),
actionButton("test2", "test2"))
)
server <- shinyServer(function(input, output) {
observeEvent(input$test1 | input$test2, {
if(input$test1==0 && input$test2==0){
return()
}
print('Hello World')
})
})
shinyApp(ui, server)
observeEvent 是复杂 observe 案例的包装器。在这种特定情况下,当一个或其他反应值发生变化时,可以使用简单的 observe。 这行得通:
require(shiny)
ui <- basicPage(
actionButton("test1", "test1"),
actionButton("test2", "test2")
)
server <- function(input, output, session){
observe( {
input$test1
input$test2
if(input$test1==0 && input$test2==0){
return()
}
print('Hello World')
})
}
shinyApp(ui, server)
使用带有选项的 observeEvent 可以消除 return() 调用:
ui <- basicPage(
actionButton("test1", "test1"),
actionButton("test2", "test2")
)
server <- function(input, output, session){
observeEvent(input$test1 | input$test2, { print('Hello World') } , ignoreInit = TRUE)
}
shinyApp(ui, server)
如果输入不是数字、逻辑或复杂类型,则在 observeEvent()
eventExpr
中使用 |
运算符将不起作用。
例如,请注意 运行 这个简单的 Shiny 应用程序末尾的消息,其中包含 actionButton()
和 内部使用的 selectInput()
observeEvent()
eventExpr
:
library(shiny)
ui <- shinyUI(bootstrapPage(
selectInput("test1", "test1", choices = c("a", "b")),
actionButton("test2", "test2"))
)
server <- shinyServer(function(input, output) {
observeEvent(input$test1 | input$test2,
{
print('Hello World')
})
})
shinyApp(ui, server)
#>
#> Listening on http://127.0.0.1:6563
#> Warning: Error in |: operations are possible only for numeric, logical or
#> complex types
由 reprex package (v2.0.1)
于 2022-04-02 创建
相反,如果您不希望在应用程序初始化时打印“Hello World”,则可以在 observeEvent()
中创建一个输入向量并包含 ignoreInit = TRUE
。这种方法适用于任何输入类型。
library(shiny)
ui <- shinyUI(bootstrapPage(
selectInput("test1", "test1", choices = c("a", "b")),
actionButton("test2", "test2"))
)
server <- shinyServer(function(input, output) {
observeEvent(ignoreInit = TRUE, c(
input$test1,
input$test2
),
{
print('Hello World')
})
})
shinyApp(ui, server)
如果 observeEvent(c(input$a, input$b), {...})
方法不能使您满意,那么我可以推荐 reactive({list(input$a, input$b})
方法,如下所示:
library(shiny)
ui <- shinyUI(bootstrapPage(
selectInput("test1", "test1", choices = c("a", "b")),
actionButton("test2", "test2"))
)
server <- shinyServer(function(input, output) {
event_trigger <- reactive({
list(input$test1, input$test2)
})
observeEvent(ignoreInit = TRUE, event_trigger(),
{
print('Hello World')
})
})
shinyApp(ui, server)
这种方法的优点是可移植,这意味着如果需要,您可以将其用作多个 observeEvent()
调用(或其他侦听器)的 eventExpr
。
我想要两个不同的事件来触发观察者。有人建议
observeEvent({
input$spec_button
mainplot.click$click
}, { ... } )
看看这个例子。
ui <- shinyUI(bootstrapPage(
actionButton("test1", "test1"),
actionButton("test2", "test2"))
)
server <- shinyServer(function(input, output) {
observeEvent({
input$test1
input$test2
}, {
print('Hello World')
})
})
shinyApp(ui, server)
单击按钮 test1 后没有任何反应。如果您单击按钮 test2,它会打印到您的控制台。按下 test2 按钮后,单击 test1 将打印消息。这是一种奇怪的行为。
list(input$test1, input$test2)
即使不单击按钮也会打印消息。
应该这样做,请注意,您仍然需要检查按钮是否被点击,如@MrFlick 所述
1。您可以使用反应式表达式
#rm(list = ls())
library(shiny)
ui <- shinyUI(bootstrapPage(
actionButton("test1", "test1"),
actionButton("test2", "test2"))
)
server <- shinyServer(function(input, output) {
toListen <- reactive({
list(input$test1,input$test2)
})
observeEvent(toListen(), {
if(input$test1==0 && input$test2==0){
return()
}
print('Hello World')
})
})
shinyApp(ui, server)
2。根据@MrFlick 给出的示例(现已删除)
#rm(list = ls())
library(shiny)
ui <- shinyUI(bootstrapPage(
actionButton("test1", "test1"),
actionButton("test2", "test2"))
)
server <- shinyServer(function(input, output) {
observeEvent(input$test1 | input$test2, {
if(input$test1==0 && input$test2==0){
return()
}
print('Hello World')
})
})
shinyApp(ui, server)
observeEvent 是复杂 observe 案例的包装器。在这种特定情况下,当一个或其他反应值发生变化时,可以使用简单的 observe。 这行得通:
require(shiny)
ui <- basicPage(
actionButton("test1", "test1"),
actionButton("test2", "test2")
)
server <- function(input, output, session){
observe( {
input$test1
input$test2
if(input$test1==0 && input$test2==0){
return()
}
print('Hello World')
})
}
shinyApp(ui, server)
使用带有选项的 observeEvent 可以消除 return() 调用:
ui <- basicPage(
actionButton("test1", "test1"),
actionButton("test2", "test2")
)
server <- function(input, output, session){
observeEvent(input$test1 | input$test2, { print('Hello World') } , ignoreInit = TRUE)
}
shinyApp(ui, server)
如果输入不是数字、逻辑或复杂类型,则在 observeEvent()
eventExpr
中使用 |
运算符将不起作用。
例如,请注意 运行 这个简单的 Shiny 应用程序末尾的消息,其中包含 actionButton()
和 内部使用的 selectInput()
observeEvent()
eventExpr
:
library(shiny)
ui <- shinyUI(bootstrapPage(
selectInput("test1", "test1", choices = c("a", "b")),
actionButton("test2", "test2"))
)
server <- shinyServer(function(input, output) {
observeEvent(input$test1 | input$test2,
{
print('Hello World')
})
})
shinyApp(ui, server)
#>
#> Listening on http://127.0.0.1:6563
#> Warning: Error in |: operations are possible only for numeric, logical or
#> complex types
由 reprex package (v2.0.1)
于 2022-04-02 创建相反,如果您不希望在应用程序初始化时打印“Hello World”,则可以在 observeEvent()
中创建一个输入向量并包含 ignoreInit = TRUE
。这种方法适用于任何输入类型。
library(shiny)
ui <- shinyUI(bootstrapPage(
selectInput("test1", "test1", choices = c("a", "b")),
actionButton("test2", "test2"))
)
server <- shinyServer(function(input, output) {
observeEvent(ignoreInit = TRUE, c(
input$test1,
input$test2
),
{
print('Hello World')
})
})
shinyApp(ui, server)
如果 observeEvent(c(input$a, input$b), {...})
方法不能使您满意,那么我可以推荐 reactive({list(input$a, input$b})
方法,如下所示:
library(shiny)
ui <- shinyUI(bootstrapPage(
selectInput("test1", "test1", choices = c("a", "b")),
actionButton("test2", "test2"))
)
server <- shinyServer(function(input, output) {
event_trigger <- reactive({
list(input$test1, input$test2)
})
observeEvent(ignoreInit = TRUE, event_trigger(),
{
print('Hello World')
})
})
shinyApp(ui, server)
这种方法的优点是可移植,这意味着如果需要,您可以将其用作多个 observeEvent()
调用(或其他侦听器)的 eventExpr
。