Code organisation in R package development

2019-01-22 08:04发布

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

标签: r package
4条回答
时光不老,我们不散
2楼-- · 2019-01-22 08:09

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

R/mcmc_a.R R/mcmc_b.R R/prediction_p1.R R/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

查看更多
3楼-- · 2019-01-22 08:18

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.

查看更多
叛逆
4楼-- · 2019-01-22 08:19

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.

查看更多
The star\"
5楼-- · 2019-01-22 08:28

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.

查看更多
登录 后发表回答