【问题标题】:How to define "hidden global variables" inside R packages?如何在 R 包中定义“隐藏的全局变量”?
【发布时间】:2016-03-19 04:57:39
【问题描述】:

我在 R 中有以下 2 个函数:

exs.time.start<-function(){
  exs.time<<-proc.time()[3]
  return(invisible(NULL))
}

exs.time.stop<-function(restartTimer=TRUE){
  if(exists('exs.time')==FALSE){
    stop("ERROR: exs.time was not found! Start timer with ex.time.start")
  }
  returnValue=proc.time()[3]-exs.time
  if(restartTimer==TRUE){
    exs.time<<-proc.time()[3]
  }
  message(paste0("INFO: Elapsed time ",returnValue, " seconds!"))
  return(invisible(returnValue))
}

函数exs.time.start 创建一个全局变量 (exs.time),其中包含我调用该函数时的 CPU 时间。

函数exs.time.stop 访问该全局变量并返回执行exs.time.startexs.time.stop 之间的时间。

我的目标是用这两个函数在 R 中创建一个包。如何将该全局变量 (exs.time) 定义为对用户不可见的变量,因此他在 R 全局环境中看不到该变量?

我可以将此变量定义为 R 包环境/命名空间内的“隐藏”全局变量吗?

这是我第一次使用包,所以我不知道在定义包时如何很好地使用命名空间文件。我正在使用 R Studio 和 Roxygen2 创建我的包。

任何帮助或建议都会很棒!

【问题讨论】:

  • 也许前缀是点?如.exs.time

标签: r r-package


【解决方案1】:

我在几个包中使用包全局环境:

可能还有更多,但你明白了。

【讨论】:

    【解决方案2】:

    感谢您分享您的包裹@Dirk Eddelbuettel

    我的问题的解决方案如下:

    .pkgglobalenv <- new.env(parent=emptyenv())
    
    exs.time.start<-function(){
      assign("exs.time", proc.time()[3], envir=.pkgglobalenv)
      return(invisible(NULL))
    }
    
    exs.time.stop<-function(restartTimer=TRUE){
      if(exists('exs.time',envir=.pkgglobalenv)==FALSE){
        stop("ERROR: exs.time was not found! Start timer with exs.time.start")
      }
      returnValue=proc.time()[3]-.pkgglobalenv$exs.time
      if(restartTimer==TRUE){
        assign("exs.time", proc.time()[3], envir=.pkgglobalenv)
      }
      message(paste0("INFO: Elapsed time ",returnValue, " seconds!"))
      return(invisible(returnValue))
    }
    
    • 我在我的 R 文件中,在我的函数定义之前创建了一个带有new.env() 的环境。
    • 我已经使用assign() 访问环境并更改了我的全局变量的值!

    变量是隐藏的,一切正常!谢谢大家!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-09-17
      • 2018-01-27
      • 2016-05-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-29
      相关资源
      最近更新 更多