[R-pkg-devel] Simple way to run code during package install

Duncan Murdoch murdoch@dunc@n @end|ng |rom gm@||@com
Tue Nov 19 15:01:09 CET 2024


I have some code in rgl and rgl2gltf that should be run during the 
package install process, and not later.  (It's a call to 
rgl::makeDependency, which does some stuff with Javascript files and 
writes into the package installation directory, saving the paths of the 
files it wrote.)

Currently rgl handles this by simply placing calls to makeDependency in 
one of the .R files, relying on the fact that they are run at install 
time and not later. It creates rgl:::rglDependency and another similar 
object.  That works fine.

Tomas just pointed out to me that rgl2gltf is trying to modify its 
installation location after installation.  This is happening because it 
calls makeDependency in a function the user can call, and that's bad, so 
I'm fixing it.

The problem is that rgl2gltf uses Roxygen for documentation, and Roxygen 
executes all the code in the package when it is producing Rd files. 
(Normally this just creates the functions in the package, it doesn't 
actually call them, so it's harmless.  But calling makeDependency from 
Roxygen fails because I wasn't expecting that.)

So I'd like to ask for suggestions for the simplest way to deal with 
this in rgl2gltf.

1. One choice is to fix rgl::makeDependency so it can tell that it is 
being run after installation, and stop trying to write any files.  It 
should just return the object.  I can probably do this, but I've just 
had two rgl releases in the last few weeks, so I'd prefer to limit the 
changes to rgl2gltf.

2. I can use pkgload::is_loading() to detect the load_all() call from 
Roxygen and not run makeDependency in that situation.  But that forces a 
dependence on pkgload, and that's not very appealing.

3. Maybe I can mark the file that contains the makeDependency call so 
that Roxygen ignores it.  Is that possible?

4. I can write a Makevars file that runs makeDependency.  That seems
like a pretty heavyweight solution, especially since I need to save the 
result of the call so it is available later.

Does anyone else have this problem, and a nice solution for it?

Duncan Murdoch



More information about the R-package-devel mailing list