R shiny eventReactive按钮根据所选的checkboxgroup子集数据帧

时间:2015-12-22 07:42:52

标签: r shiny reactive-programming

此问题从another question延伸,正确解释了如何使用按钮根据滑块对数据框进行子集化。

我需要对我的真正问题提供更具体的帮助。

我的server.R中有一个函数“transition_matrix”,它有2个输入:(a)包含产品信息的数据帧和(b)日期。我将数据框预加载为固定,但允许用户更改日期。因此,当用户更改日期时,函数将针对给定的数据帧和所选日期执行。

到目前为止的代码:

server.R

shinyServer(function(input, output) {

  bigmatrix <- reactive({
    transition_matrix(capital_summary_cum, ceiling_date(as.Date(input$datebox),"month")-1)
  })

output$balance_matrix <- renderTable({
    balances_ <- bigmatrix()[1:(default_state +2),] %>%
      round(digits = 0) %>% 
      format(big.mark = ",") 

  transition_matrix <- function(df1, date1){
    date2 <- ceiling_date(as.Date(AddMonths(date1,1)),"month")-days(1)
    ...
    ...

我接下来要做的是允许用户也对日期框架进行子集化。为此,我提供了一组代表产品的复选框。因此,除了日期之外,用户还可以选择要执行上述功能的产品子集。

问题是该功能需要大约1.5秒才能执行,因此每次用户检查一个盒子(其中大约有40个)时,将调用该功能,产生不需要的1.5秒延迟。

我宁愿隔离(?)复选框以允许用户选择所需的产品列表,直到单击按钮。单击按钮后,我希望根据所选复选框对数据框进行子集化,然后将其输入到函数中。我真的希望日期输入保持“完全被动”,这样我每次日期也都不需要按下按钮。

如何添加一个按钮,根据所选的复选框对我的数据框进行子集化,并自动调用具有所选日期的函数?

1 个答案:

答案 0 :(得分:1)

我认为这与你想要实现的类似。 注意:

使用reactiveEvent指定要对其做出反应的应用。在这种情况下,get_table函数会对更新按钮和日期复选框作出反应,而变量复选框则不会触发该函数。

为了您的信息,actionButton内部有一个整数值,单击时该值增加1。该应用程序检测值的变化并触发该功能。

library(shiny)
ui <- list(checkboxGroupInput("varbox", "Variable", choices = c("x", "y")),
           br(), br(),
           checkboxGroupInput("datebox", "Date", choices = c("1", "2", "3")),
           br(), br(),
           actionButton("btn", "update"),
           tableOutput("tbl")) 

server <- function(input, output) {

  sub_fun <- function(dates, variables) {
    # sub function to create table
    # this does not have any reactive element inside
    tmp <- data.frame(day = rep(1:3, 4), x = 1:12, y = 13:24)
    tmp[tmp$day %in% dates, c("day", variables), drop = FALSE]
  }

  get_table <- eventReactive({input$btn; input$datebox}, {
    # reactive function to define the configulation
    sub_fun(as.character(input$datebox), input$varbox)
  })  

  output$tbl <- renderTable({
    get_table()
  })
}

runApp(list(ui = ui, server = server))