NAMESPACE tags

The package NAMESPACE is one of the most confusing parts of building a package. Roxygen2 aims to make it as easy as possible to build a package that is a well-behaved member of the R ecosystem. This is a little frustrating at first, but soon becomes second-nature.

Exports

For a function to be usable outside of your package, you must export it. By default roxygen2 doesn’t export anything from your package. If you want an object to be publicly available, you must explicitly tag it with @export.

Use the following guidelines to decide what to export:

Specialised exports

Generally, roxygen2 can generate the correct namespace directive when @exporting a specific object. However, you may want to override the defaults and exercise greater control. In this case you can use the more specialised tags described below:

For even more specialised cases you can use @rawNamespace code which inserts code literally into the NAMESPACE. If you need to automate this, @evalNamespace foo() will evaluate the foo() in the package environment and insert the results into NAMESPACE.

Imports

The NAMESPACE also controls which functions from other packages are made available to your package. Only unique directives are saved to the NAMESPACE file, so you can repeat them as needed to maintain a close link between the functions where they are needed and the namespace file.

If you are using just a few functions from another package, the recommended option is to note the package name in the Imports: field of the DESCRIPTION file and call the function(s) explicitly using ::, e.g., pkg::fun(). Alternatively, though no longer recommended due to its poorer readability, use @importFrom, e.g., @importFrom pgk fun, and call the function(s) without ::.

If you are using many functions from another package, use @import package to import them all and make available without using ::.

If you want to add a new method to an S3 generic, import it with @importFrom pkg generic.

If you are using S4 you may also need:

To import compiled code from another package, use @useDynLib