我想了解为什么在使用eventReactive
而不是reactive
与actionButton
一起刷新页面时,我得到的行为与我的预期不同。
例如,这个简单的 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)
根据我对actionButton
和eventReactive
的理解,我可以将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)