闪亮 - 反应环境是否可能?

Shiny - Are reactive environments possible?

现在,我的表情是这样的:

您可以 运行 直接使用 app.R 文件。它是独立的,并且演示了我想要的效果。

library(shiny)


rval <- reactiveValues()
rval$var <- new.env()
rval$flag <- FALSE

isolate({
  rval$var$a <- 1
  rval$var$b <- "Hello"
  rval$var$c <- c(1.2, 12.3, 123.0)
  rval$var$d <- list(1,2,"A")
})

ui <- navbarPage('reactiveTest',
  tabPanel('Analysis',
    fluidRow(
      actionButton("addVar", "Add a NULL var"),
      tableOutput('vars')
    ) 
  )
)

core_variable_table <- eventReactive(rval$flag == TRUE, {
  print(ls(rval$var))
  rval$flag <- FALSE

  df <- data.frame(ls(rval$var),
                   sapply(ls(rval$var), function(x){ class(get(x, envir = rval$var))}),
                   sapply(ls(rval$var), function(x){
                     y <- head(get(x, envir = rval$var))
                     if(is.null(y)) {
                       return("NULL")
                     } else {
                       return(toString(y))
                     }
                   })
  )
  rownames(df) <- seq(1, length(ls(rval$var)))
  colnames(df) <- c('Name', 'Type', 'Content')

  return(df)
})

dothis <- function(name, data) {
  observe({
    assign(x=name,
           value=data,
           envir=rval$var)
  })

  isolate({
    rval$flag <- TRUE
  })
}

server <- function(input, output, session) {
  output$vars <- renderTable({
      return(core_variable_table())
  })

  observeEvent(input$addVar, {
    rval$update
    dothis("gecko", NULL)
  })

}

shinyApp(ui, server)

如您所见,我试图将整个环境绑定为一个变量,并且我希望在该环境中的任何变量被修改时发生变化。我如何将 Shiny 输出的反应性绑定到整个环境或该环境中的变量,而不必使用这种可怕的标志方法?

编辑: 请注意,一旦我开始有多个函数可以触发,一切都开始分崩离析。我不希望必须从一个函数中翻转 5 个标志——Shiny 应该有一种方法可以做这样的事情……

我提出的解决方法是改为根据标志或整数增量生成环境视图。例如,如果我修改环境中的任何变量,我会手动更改一个反应变量,该变量会向需要更新的应用程序输出发出信号。