13
votes

I have the following 2 functions in 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))
}

The function exs.time.start creates a global variable (exs.time) with the CPU time of the moment when I called the function.

The function exs.time.stop access that global variable and return the time between the execution of exs.time.start and exs.time.stop.

My objective is to create a package in R with these two functions. How can I define that global variable (exs.time) to be a variable that's invisible to the user, so he couldn't see this variable in the R Global Environment?

Can I define this variable to be a "hidden" global variable inside the R package environment/namespace?

It's my first time working with packages, so I don't know exactly how to use very well the namespace file when defining packages. I'm creating my package using R Studio and Roxygen2.

Any help or suggestion would be great!

2
Maybe prefix with a dot? As in .exs.timeTyler Rinker

2 Answers

13
votes

Thank you for sharing your packages @Dirk Eddelbuettel

The solution for my question is the following:

.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))
}
  • I've created an environment with new.env(), inside my R file, before my function definitions.
  • I've used assign() to access the environment and change the value of my global variable!

The variable is hidden and everything works fine! Thanks guys!

8
votes

I use package-global environments in a few packages:

and there are probably some more but you get the idea.