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.
I think there wouldn't be a big difference in timing, but I'd guess
there'd be a slight advantage to having them in the environment of the
objective function. I'd recommend testing both ways if you want to be sure.
Here are the differences that might matter:
- putting them as arguments has the overhead of constructing the
argument list each time, and if the args are used, the overhead of
resolving promises.
- putting them in the environment of the function means lookups will
take two steps: the evaluation frame followed by its parent, instead of
succeeding in the first lookup.
I suspect the overhead of arguments is bigger, but it's probably not
very big.
Duncan Murdoch
______________________________________________
[email protected] mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel