当前位置:  开发笔记 > 编程语言 > 正文

如何在R包中定义"隐藏的全局变量"?

如何解决《如何在R包中定义"隐藏的全局变量"?》经验,为你挑选了2个好方法。

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

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))
}

该函数使用我调用函数时的CPU时间exs.time.start创建一个全局变量(exs.time).

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

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

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

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

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



1> Dirk Eddelbu..:

我在几个包中使用package-global环境:

RcppGSL存储有关GSL库的配置信息

RPushbullet存储一些与用户相关的元数据

并且可能还有更多,但你明白了.



2> Renan V. Nov..:

感谢您分享您的包裹@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))
}

new.env()在我的R文件中创建了一个环境,在我的函数定义之前.

我曾经习惯assign()访问环境并更改全局变量的值!

隐藏变量,一切正常!多谢你们!

推荐阅读
手机用户2502851955
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有