How do I prevent "r 'library' or 'require' calls not declared" warnings when developing a package?
r
Solution
The most likely candidate is that your functions contain unnecessary calls to `require(<pkg>)` or `library(<pkg>)`. The error message is a bit misleading -- it's telling you that you've placed `require` or `library` calls in your code, but haven't actually (properly) declared those calls in your `DESCRIPTION` file.
If your intention was to use code from those packages in your own package, then you don't need these `library` / `require` calls; rather, you need to properly declare that you're using those packages (and how you're using them) in your `DESCRIPTION` file.
Most likely, you want to 'import' the package and make some, or all, of its exported functions / symbols available to your package. You can add such packages to the `Imports:` field in your `DESCRIPTION` file -- as e.g.
Imports: <pkg>
and similarly, declare that you want to use all exported symbols from that package by writing, in the `NAMESPACE` file,
import(<pkg>)
By doing this, all of the functions in `<pkg>`'s namespace are automatically made available and hence it is not necessary to `require` that package anywhere in your code.
Within the context of a package, the main use of `require` is for functions that you would like make available only conditionally. For example, suppose you write a function that handles a very specific plotting method which requires `foo`, but `foo` is otherwise un-needed in your package. So, if you wanted to include code that conditionally depends on package `foo`, you can write something of the form:
if (require("foo")) {
#do stuff
}
and then you can include `foo` in the `DESCRIPTION` under `Suggests:` rather than `Imports:`. Another example is a package used in producing a vignette but is never required by the users of your package.
In sum: if you are importing a package only to use the functions exported in that package's namespace, you don't need to `library` or `require` it anywhere in your package code.
EDIT: In newer versions of R, `R CMD check` may warn if you use `require`, and instead suggest you use `requireNamespace`. In that case, you can follow the pattern:
## Use the 'bar' function from package 'foo'
if (requireNamespace("foo", quietly = TRUE)) {
foo::bar()
}
Problem
I'm developing a package that depends on package `foo`, and in my package code there is a call to a function exported from `foo`. I've included the package name in the `NAMESPACE` with an `import(foo)` declaration, and also under the `Imports:` line in the `DESCRIPTION` file. However, I get the following warning when running `R CMD check`: ``` r 'library' or 'require' calls not declared from: 'foo' ``` What am I missing? There is a similar question at Loading depending packages using .onLoad, but it doesn't seem to discuss this specific warning.