Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I prevent "r 'library' or 'require' calls not declared" warnings when developing a package?

Tags:

r

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.

like image 652
Kevin Ushey Avatar asked Mar 26 '13 22:03

Kevin Ushey


2 Answers

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() } 
like image 122
Kevin Ushey Avatar answered Sep 28 '22 10:09

Kevin Ushey


FYI, it's bad form to import all functions of package (when you don't use them) with:

@import package  

Better to just

package::thisOne() 

When you need it, or

@importFrom package thisOne 

If you use a particular function repeatedly

like image 22
tim Avatar answered Sep 28 '22 10:09

tim