我在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))
}
函数exs.time.start
创建一个全局变量(exs.time
),其中包含我调用函数时的CPU时间。
函数exs.time.stop
访问该全局变量,并返回执行exs.time.start
和exs.time.stop
之间的时间。
我的目标是使用这两个函数在R中创建一个包。如何将该全局变量(exs.time
)定义为对用户不可见的变量,因此他无法在R全局环境中看到此变量?
我可以将此变量定义为R包环境/命名空间内的“隐藏”全局变量吗?
这是我第一次使用软件包,因此在定义软件包时,我不知道如何使用命名空间文件。我正在使用R Studio和Roxygen2创建我的包。
任何帮助或建议都会很棒!
答案 0 :(得分:6)
我在几个软件包中使用了package-global环境:
RcppGSL存储config info about the GSL libraries
RPushbullet存储了一些user-related meta data
并且可能会有更多,但你明白了。
答案 1 :(得分:6)
感谢您分享您的软件包@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()
的环境,在我的函数定义之前。 assign()
访问环境并更改全局变量的值!隐藏变量,一切正常!谢谢你们!