我在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创建我的包.
任何帮助或建议都会很棒!
我在几个包中使用package-global环境:
RcppGSL存储有关GSL库的配置信息
RPushbullet存储一些与用户相关的元数据
并且可能还有更多,但你明白了.
感谢您分享您的包裹@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()
访问环境并更改全局变量的值!
隐藏变量,一切正常!多谢你们!