2017-08-01 35 views
1

我想知道爲什麼我得到不同的行爲,比我用的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) 

根據我的理解actionButtoneventReactive我雖然我可以用

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顯示應用程序加載時的情節?

回答

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) 
相關問題