闪亮:当eventReactive函数将另一个eventReactive函数的输出作为输入时,ignoreNULL不起作用?

时间:2019-02-03 16:55:42

标签: r shiny

我正在开发一个Shiny应用程序,该应用程序首先生成数据,然后根据选定的输入(要绘制的列,要使用的颜色等)绘制数据。

我希望仅在用户单击操作按钮(操作按钮1)之后才生成数据,并且将根据默认选择的输入将绘图与数据一起创建。并且当用户想要更改输入时,他们将需要单击另一个动作按钮(动作按钮2)来更新绘图。当用户单击操作按钮2时,不应重新生成数据。

有办法吗?

我已经为eventReactive()尝试过ignoreNULL,但是当为数据生成反应性函数将其设置为TRUE时,将ignoreNULL = FALSE设置为绘图反应性函数似乎不起作用

以下是我正在尝试做的一个简单示例:

library(shiny)

ui <- fluidPage(
  titlePanel("Test"),
  sidebarLayout(
    sidebarPanel(
      actionButton('data', 'Generate Random Data'),
      hr(),
      radioButtons("column", label = "Select Column: ", choices = c("x", "y")),
      actionButton('plot', 'Plot')
    ),
    mainPanel(
      plotOutput("result")
    )
  )
)

server <- function(input, output) {
  #### read in data
  dataReactive <- eventReactive(input$data, {
    dt <- data.frame("x" = rnorm(100), "y" = rnorm(100, mean = 100))
  }, ignoreNULL = FALSE)
  plotReactive <- eventReactive(input$plot, {
    dt <- dataReactive()
    p <- hist(dt[[input$column]])
  }, ignoreNULL = FALSE)
  output$result <- renderPlot({
    p <- plotReactive()
  })
}

# Run the application 
shinyApp(ui = ui, server = server) 

我期望该应用程序将从空白页开始,并且在首次单击“生成随机数据”按钮时,将显示直方图,而无需单击“绘图”按钮。但是,当更改选择列时,则必须单击“图”按钮以更新图。

原因是因为我正在处理的实际应用程序实际上需要很长时间才能从数据库中提取数据。因此,我不希望应用程序在用户准备好之前自动启动。而且我不想每次用户想要更改绘图设置时都提取数据,因为所有绘图都使用相同的数据。

任何帮助将不胜感激。谢谢。

1 个答案:

答案 0 :(得分:0)

这是您所期望的吗?

library(shiny)

ui <- fluidPage(
  titlePanel("Test"),
  sidebarLayout(
    sidebarPanel(
      actionButton('data', 'Generate Random Data'),
      hr(),
      radioButtons("column", label = "Select Column: ", choices = c("x", "y")),
      actionButton('plot', 'Plot')
    ),
    mainPanel(
      plotOutput("result")
    )
  )
)

server <- function(input, output) {
  #### read in data
  dataReactive <- eventReactive(input$data, {
    print('generationg')
    dt <- data.frame("x" = rnorm(100), "y" = rnorm(100, mean = 100))
  })
  plotReactive <- eventReactive({
      input$plot
      input$data
    }, {
    dt <- dataReactive()
    p <- hist(dt[[input$column]])
  }, ignoreNULL = FALSE)
  output$result <- renderPlot({
    p <- plotReactive()
  })
}

# Run the application 
shinyApp(ui = ui, server = server)