When developing packages in R
all R
source files are put in the subdirectory R/
, and all compiled code is put in the subdirectory src/
.
I would like to add some organisation to files within these folders, rather than have everything dumped at the top level. For example, lets say I'm hypothetically developing a client-server application. Logically, I would like to organise all my client R source files in R/client/
and all my server R source files in R/server/
.
Is it possible to organise code in subfolders when developing a package, and if so, how? The Writing R Extensions manual doesn't offer any guidance, nor does R CMD build
detect files stored in subfolders under R/
.
I argued with R core team Allow for sub-folders in "package/R/" directory . They seem not really want improve it. So my workflow is as follows.
1) Create an R project same as other packages but allow sub-directories in folder
R/
such asR/mcmc/a.R R/mcmc/b.R R/prediction/p1.R R/predection/p2.R
2) When I need to pack them, I convert all files under
R/
asR/mcmc_a.R R/mcmc_b.R R/prediction_p1.R R/predection_p2.R ...
with mypackage.flatten()
function3) Then I install the flattened version to R.
I wrote a simple script for Linux to do everything
https://github.com/feng-li/flutils/blob/master/inst/bin/install.HS
Recognizing the thread is a bit old, I just thought I'd throw in my solution to this problem. Note that my issue is similar, but I am only concerned with preserving folder hierarchies in development.
In development, I organize my script files in subfolders to my heart's content, but rather than fight R's flat hierarchy in production, I added my own "compile-time constant", so to speak.
That is, in every file located in a subfolder (not in top-level scripts/), I add the following:
Then, I load whatever other dependencies are required as follows:
The default assumption is that the code is in production, (source.debug = FALSE), so when in development, just ensure that source.debug = TRUE and the project's script/ folder is set as the working directory before loading any script files.
Of course, this example's a bit simple - it assumes that all script file dependencies exist in the same folder, but it seems a simple issue to devise a system that would suit more complicated development folder hierarchies.
Expanding the comment to Hadley's IMHO incorrect answer:
Look at the Matrix package (written by R Core members) which has five folders below
src/
, and two of these contain other subfolders. Other example is the Rsymphony packages (co-)written and maintained by an R Core member.Doing this is not for the faint of heart. R strongly prefers a
src/Makevars
fragment over a fullsrc/Makefile
in order to be able to construct its ownMakefile
versions for the different subarchitectures. But if you know a little make and are willing to put the effort in, this is entirely doable -- and being done.That still does not make it recommended though.
You can't use subfolders without additional setup (like defining a custom makefile). The best you can do is to use prefixes:
client-a.r
,client-b.r
,server-a.r
,server-b.r
, etc.