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

时间:2015-07-17 02:36:09

标签: r shiny reactive-programming

现在,我的表达式如下:

您可以使用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应该有办法做这样的事情......

1 个答案:

答案 0 :(得分:0)

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