代码之家  ›  专栏  ›  技术社区  ›  Fitzzz

R R6Class shinyApp全球obj

  •  0
  • Fitzzz  · 技术社区  · 7 年前

    在我的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后,计数所有以前的初始化。

    2 回复  |  直到 7 年前
        1
  •  0
  •   Gregor de Cillia    7 年前

    此行为记录在 R6 vignettes

    reactiveValues reactiveVal )具有上述引用语义 here 。这就是为什么您发布的解决方案会产生预期结果,而您问题中的代码会在类的所有实例中产生“共享目录”。

    this question of yours 但是如果你想的话,我可以纠正它。

        2
  •  0
  •   Fitzzz    7 年前

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

    public = list(
        catalogs = reactiveValues(),
    

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