r语言 - 闪亮应用程序:事件反应性和反应性不一致行为与动作按钮到"Refresh"



我想了解为什么在使用eventReactive而不是reactiveactionButton一起刷新页面时,我得到的行为与我的预期不同。

例如,这个简单的 Shiny 仪表板的行为符合我的预期:加载时会显示绘图,我可以在单击刷新按钮时修改过滤器并刷新绘图。

# app1.R
library(shiny)
library(dplyr)
library(ggplot2)
species <- levels(iris$Species)
ui <- fluidPage(
sidebarLayout(
sidebarPanel(
selectInput("species", "Select Iris Species", 
choices = species, selected=species, multiple = TRUE),
actionButton("refresh", "Refresh")
),
mainPanel(plotOutput("scatterplot"))
)
)
server <- function(input, output) {
selected_data <- reactive({
input$refresh
isolate({
iris %>% filter(Species %in% input$species)
})
})
output$scatterplot <- renderPlot({
plot(selected_data())
})
}
shinyApp(ui = ui, server = server)

根据我对actionButtoneventReactive的理解,我可以将selected_data的代码替换为

selected_data <- eventReactive( input$refresh, {
iris %>% filter(Species %in% input$species)
})

这样我就明确表示selected_data只取决于input$refresh

但是,该应用程序的行为与我预期不同:加载时不显示任何情节,我必须明确单击"刷新"才能显示情节。之后,一切都按预期工作。

以下是该应用程序第二个版本的完整代码:

# app2.R
library(shiny)
library(dplyr)
library(ggplot2)
species <- levels(iris$Species)
ui <- fluidPage(
sidebarLayout(
sidebarPanel(
selectInput("species", "Select Iris Species", 
choices = species, selected=species, multiple = TRUE),
actionButton("refresh", "Refresh")
),
mainPanel(plotOutput("scatterplot"))
)
)
server <- function(input, output) {
selected_data <- eventReactive( input$refresh, {
iris %>% filter(Species %in% input$species)
})
output$scatterplot <- renderPlot({
plot(selected_data())
})
}
shinyApp(ui = ui, server = server)

根据文档,当执行 Shiny 应用时,input$refresh应该将值从 NULL 更改为 0,这反过来又会触发selected_data评估并显示绘图。

您能解释一下为什么在加载应用程序时app1.R显示情节,而app2.R您必须手动强制刷新吗?

有什么(干净的(方法可以让app2.R加载应用程序时显示情节?

eventReactive中有一个参数ignoreNULL,默认情况下它设置为TRUE,如果您将其更改为FALSE它将触发。欲了解更多信息,请参阅?eventReactive

library(shiny)
library(dplyr)
library(ggplot2)
species <- levels(iris$Species)
ui <- fluidPage(
sidebarLayout(
sidebarPanel(
selectInput("species", "Select Iris Species", 
choices = species, selected=species, multiple = TRUE),
actionButton("refresh", "Refresh")
),
mainPanel(plotOutput("scatterplot"))
)
)
server <- function(input, output) {
selected_data <- eventReactive( input$refresh, {
iris %>% filter(Species %in% input$species)
},ignoreNULL = F)
output$scatterplot <- renderPlot({
plot(selected_data())
})
}
shinyApp(ui = ui, server = server)

最新更新