Does roxygen2 automatically write NAMESPACE directives for "Imports:" packages?
Asked Answered
W

1

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.

Waterfront answered 22/12, 2011 at 0:9 Comment(7)
AFAIK, as long as you tag your function with @imports package or @importsFrom package function, roxygen2 will take care of writing the namespace directives.Murage
Currently, the namespace roclet will modify NAMESPACE but not DESCRIPTIONPer
@Murage That's exactly the solution I was looking for! If you post it as a quick answer I can formally accept it.Waterfront
to avoid the confusion I had, @Murage is right, but it should be @importFrom package function, not --@importsFrom.(no s)Limbus
Am I right in saying that user always has to manually write their DESCRIPTION file? So one workflow is to use @imports in Roxygen2, and then inspect the autogenerated NAMESPACE for imports statements, and manually transcribe the libraries into Imports: in DESCRIPTION?Creech
@Creech 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: .Waterfront
@Creech > 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#importsWaterfront
M
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

Murage answered 25/12, 2011 at 15:47 Comment(10)
Per JPMac's comment above: Shouldn't it be @importFrom package function ...?Calcimine
Yes. It should be @importFrom package function. I have edited my answer to reflect that. Thanks for catching it.Murage
I now recommend using package::function, not @importFrom package function.Per
So do you mean @import package::function ?Murage
@Murage 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.Flyback
Yes. roxygen2 made some changes to make things easier I believe.Murage
Is it @import or @imports?Dubitable
Funny. I use package::function(), and the package is in the Imports section of DESCRIPTION, and I have done load_all(".") on the package...and yet the function could not be found. Edit: Ah, it appears if you are using RStudio, you ahve to specify that roxygen will generate NAMESPACE file.Cordelia
In addition, I had forgotten that you must call document() to update NAMESPACE, not load_all()Cordelia
@Dubitable it's @import in the roxygen2 header; it's import() in the NAMESPACE; and it's Imports: in the DESCRIPTIONAppoggiatura

© 2022 - 2024 — McMap. All rights reserved.