我想知道爲什麼我得到不同的行爲,比我用的eventReactive
代替reactive
時連同actionButton
刷新頁面預期。閃亮的應用程序:eventReactive與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 <- eventReactive(input$refresh, {
iris %>% filter(Species %in% input$species)
})
這樣,我作出明確的是selected_data
僅取決於input$refresh
更換爲selected_data
的代碼。
然而,該應用程序並沒有像我預期的那樣工作:在加載時沒有顯示任何情節,我必須明確地點擊「刷新」才能顯示情節。之後,一切都按預期工作。
這裏是應用程序的第二版本的完整代碼:
# 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)
根據文檔,當閃亮應用執行input$refresh
應該已經改變值從NULL爲0,這在匝觸發評價selected_data
並顯示該圖。
你能解釋一下爲什麼在app1.R
的情節顯示當應用程序加載和app2.R
你必須手動強制刷新?
有什麼(乾淨的)我可以讓app2.R
顯示應用程序加載時的情節?