[Rd] Speed question: passing arguments vs environment

Duncan Murdoch murdoch@dunc@n @end|ng |rom gm@||@com
Tue Dec 2 14:48:20 CET 2025


On 2025-12-02 7:41 a.m., Therneau, Terry M., Ph.D. via R-devel wrote:
> I have a complex likelihood function f() to maximize, with lots of arguments (some of which set up indexes for derivatives, for instance).
> When using something like optim(), one can pass these arguments through via its � arg, or could make the likelihood function f() live in the same environment as the main routine so they are found directly.    Is there any advantage of one versus the other wrt speed?    At the end of the day, f() may get called thousands of times in a Hamiltonian MCMC.
> 
> Since R does not replicate arguments that are used in a read-only fashion, one might expect little to no penalty for having them on the call chain, unless the bookkeeping for copy-on-write is itself time consuming.

By the way, a nice way to put the args in the environment of the 
objective function is to use local() or a builder, e.g.

objective <- local({
   arg1 <- 1
   arg2 <- 2
   arg3 <- 3
   function(x) {
   # objective code here that can see arg1, arg2, arg3
   }
})

or

makeObjective <- function(arg1, arg2, arg3) {
   force(arg1) # evaluate the promises
   force(arg2)
   force(arg3)

   function(x) {
     # objective code here that can see arg1, arg2, arg3
   }
}

objective <- makeObjective(1,2,3)

Duncan Murdoch



More information about the R-devel mailing list