闪亮的应用程序:eventReactive和反应不一致的行为与actionButton到"刷新"

时间:2017-08-01 07:16:43

标签: r shiny

我想了解为什么在使用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

然而,该应用并不像我期望的那样:加载时没有显示情节,我必须明确点击&#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在加载应用时显示情节吗?

1 个答案:

答案 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)