简体   繁体   中英

Code organisation in R package development

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/ .

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 full src/Makefile in order to be able to construct its own Makefile 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-ar , client-br , server-ar , server-br , etc.

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:

if (!exists("script.debug"))
    script.debug = FALSE

Then, I load whatever other dependencies are required as follows:

source.list <- c(
            "script_1.R",
            "script_2.R",
            "script_3.R",
            "script_4.R"
             )

if (script.debug)
    source.list <- paste("./script_subfolder/", source.list, sep="")

lapply(source.list, source)

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.

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 as

R/mcmc/aR R/mcmc/bR R/prediction/p1.RR/predection/p2.R

2) When I need to pack them, I convert all files under R/ as

R/mcmc_a.RR/mcmc_b.RR/prediction_p1.RR/predection_p2.R ... with my package.flatten() function

3) 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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM