我想了解为什么在使用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
。
然而,该应用并不像我期望的那样:加载时没有显示情节,我必须明确点击&#34;刷新&#34;显示图表。之后一切都按预期工作。
以下是该应用的第二个版本的完整代码:
# 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
在加载应用时显示情节吗?
答案 0 :(得分:1)
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)