D C and Fortran code
If the package contains C or Fortran code, it should adhere to the standards and methods described in the System and foreign language interfaces section of the Writing R Extensions manual.
We emphasize particular points in the following sections.
D.0.1 Internal functions
Use internal functions, e.g., R_alloc
and random number generators (RNGs), over system-supplied ones.
D.0.2 C function registration
Use C function registration (See the Registering native routines section of the Writing R Extensions manual).
D.0.3 Checks for user interruption
Use R_CheckUserInterrupt()
in C level loops when there is a chance that they may not terminate for certain parameter settings or when their run time exceeds 10 seconds with typical parameter settings, and the method is intended for interactive use.
D.0.4 Makevars
Make judicious use of the Makevars
and Makefile
files within a package.
These are often not required at all (See the Configure and cleanup section of the Writing R Extensions manual).
D.0.5 Warnings and optimizations
During package development, enable all warnings and disable optimizations. If you plan to use a debugger, tell the compiler to include debugging symbols.
The easiest way to enforce these is to create a user-level Makevars
file user’s home directory in a sub-directory called ‘.R’). See examples below for flags for common toolchains.
Consult the section about Makevars files in the Writing R Extensions manual.
Example for gcc/g++:
CFLAGS=-Wall -Wextra -pedantic -O0 -ggdb
CXXFLAGS=-Wall -Wextra -pedantic -O0 -ggdb
FFLAGS=-Wall -Wextra -pedantic -O0 -ggdb
Example for clang/clang++:
CFLAGS=-Weverything -O0 -g
CXXFLAGS=-Weverything -O0 -g
FFLAGS=-Wall -Wextra -pedantic -O0 -g