【问题标题】:R R6Class global obj in shinyAppShinyApp中的R R6Class全局obj
【发布时间】:2017-07-16 04:35:55
【问题描述】:

在我的 shinyApp 中,我有一个全局变量:一个 R6Class,当我的应用程序完成后,我从 globalEnv 中删除该变量:

#' @importFrom shiny reactive
#' @export
gui <- function (port = getOption("shiny.port"),
                 host = getOption("shiny.host", "127.0.0.1"),
                 working.directory = getwd()) {
  appDir <- system.file("shiny", "gui", package = "lidRGUI")
  if (appDir == "") {
    stop("Could not find shiny directory. Try re-installing `lidRGUI`.", call. = FALSE)
  }


  catalogModele <<- CatalogModele$new()
  csvPlotsModel <<- CSVPlotsModel$new()


  on.exit({
    rm(list = c("catalogModele", "csvPlotsModel"), pos = ".GlobalEnv")
    gc()
  })

  shiny::runApp(appDir, display.mode = "normal")
}

#----------------------------------
# Catalog Modele Class
#----------------------------------
#' @importFrom R6 R6Class
#' @importFrom shiny reactiveValues 

#' @export CatalogModele
CatalogModele <- R6Class(
  public = list(
    catalogs = reactiveValues(),
    add_catalog = function(key,value) {
      self$catalogs[[key]] <- value
    },
    get_catalog = function(key) {
      return(self$catalogs[[key]])
    },
    finalize =  function() {
      print("Finalize has been called!")
    }
  )
)

我第一次启动 gui() catalogModele$catalogs 是空的,但在第一次启动之后 catalogModele$catalogs 计数所有以前的初始化。

【问题讨论】:

    标签: r package shiny reactive


    【解决方案1】:

    此行为记录在R6 vignettes

    如果您的 R6 类包含任何具有引用语义的字段(例如,其他 R6 对象和环境),则应在初始化方法中填充这些字段。如果该字段直接在类定义中设置为引用对象,则该对象将在 R6 对象的所有实例之间共享。

    reactiveValues(以及reactiveVal)具有here 中提到的引用语义。这就是为什么您发布的解决方案给出了预期的结果,而您问题中的代码导致了类的所有实例之间的“共享目录”。

    抱歉,我在写this question of yours 的答案时没有考虑到这一点,但如果您愿意,我可以更正。

    【讨论】:

      【解决方案2】:

      我找到了解决方案,但我不知道为什么会这样。我换了:

      public = list(
          catalogs = reactiveValues(),
      

      public = list(
          catalogs = NULL,
          initialize = function() {
            self$catalogs <- reactiveValues()
          },
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-17
        • 2019-03-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多