49

tl;dr version of my question

If I want to import packages, do I have to manually write import() directives into my NAMESPACE file? It seems like roxygen2 won't magically do that for me, even if I have them listed as "Imports:" in my description.

Fuller Version

This is a pretty dumb question, but I ask because the answer's not obvious to me.

I use roxygen2 to handle my R package documentation. When I want to be sure a function is exported, I add an @export tag to its roxygen block. Subsequent runs of roxygenize() will write the NAMESPACE directive accordingly.

But, my package currently imports several others:

Depends: R (>= 2.13.0), ggplot2 (>= 0.8.9) Imports: RColorBrewer, plyr, gridExtra 

It appears that while roxygen2 will rewrite the NAMESPACE directive for exported functions, it won't automatically rewrite NAMESPACE to reflect packages I've designated should be imported in my DESCRIPTION.

7
  • 5
    AFAIK, as long as you tag your function with @imports package or @importsFrom package function, roxygen2 will take care of writing the namespace directives. Commented Dec 22, 2011 at 1:01
  • 5
    Currently, the namespace roclet will modify NAMESPACE but not DESCRIPTION Commented Dec 22, 2011 at 1:02
  • 1
    to avoid the confusion I had, @Ramnath is right, but it should be @importFrom package function, not --@importsFrom.(no s) Commented May 2, 2013 at 15:37
  • 2
    @RobinL I think you have two options. Say the package you want to import is dplyr. Option 1: use @import dplyr in the roxygen block of your .R file, then refer to dplyr functions in your code like this: select(). Option 2 is to put dplyr in the Imports: field of your DESCRIPTION, then use :: notation in your R files, like this: dplyr::select. If you're using the package a lot in a given file, I suggest you use @import. If you only use it a little, I suggest double colon notation and listing it ONLY in Imports: . Commented May 25, 2017 at 13:57
  • 1
    @RobinL > It’s common for packages to be listed in Imports in DESCRIPTION, but not in NAMESPACE. In fact, this is what I recommend: list the package in DESCRIPTION so that it’s installed, then always refer to it explicitly with pkg::fun(). Unless there is a strong reason not to, it’s better to be explicit. It’s a little more work to write, but a lot easier to read when you come back to the code in the future. The converse is not true. Every package mentioned in NAMESPACE must also be present in the Imports or Depends fields. Source: r-pkgs.had.co.nz/namespace.html#imports Commented May 25, 2017 at 14:00

1 Answer 1

45

Expanding on my comment, if you want to automatically add namespace directives for packages/functions you import, you can do so by adding the @imports package or @importFrom package function line to the roxygen2 documentation header of your function.

However, as @hadley pointed out, it will only modify the NAMESPACE, but not affect the package DESCRIPTION

Sign up to request clarification or add additional context in comments.

10 Comments

I now recommend using package::function, not @importFrom package function.
So do you mean @import package::function ?
@Ramnath From the bottom section here (cran.r-project.org/web/packages/roxygen2/vignettes/…) it seems like you don't need @import if you're going to use package::function() when you call it as long as it's in the Imports: section of DESCRIPTION.
In addition, I had forgotten that you must call document() to update NAMESPACE, not load_all()
@pete it's @import in the roxygen2 header; it's import() in the NAMESPACE; and it's Imports: in the DESCRIPTION
|

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.