R6 is a _build-time_ dependency for your package. It may be possible for a
user without R6 installed to run your package without issue from the built
tarball. R today doesn't really have a concept of a build-time dependency
in the DESCRIPTION
'stats' is more of a false positive -- {codetools} simply doesn't know how
to check the R6 object DataProcessor (which it sees as an environment and
doesn't walk completely). It could find 'stats::' if it looked at
body(getNamespace(<pkg>)$DataProcessor$public_methods$filter_data)[[3]][[3]][[1]]
Anyway, Dirk's advice is correct: you can just add the entries to your
NAMESPACE:
importFrom(R6, R6class)
importFrom(stats, filter)
Once that's done, you can choose whether to continue namespace-qualifying
the calls inside the sources.
You could also explore if just putting the packages in Suggests, not
Imports, works.
Mike C
On Thu, Feb 12, 2026 at 2:33 PM Dirk Eddelbuettel <[email protected]> wrote:
>
> On 12 February 2026 at 15:52, Bjarke Hautop wrote:
> | Hi all,
> |
> | R CMD check gives a false positive locally when the only usage of an
> | imported package is through pkg::foo() inside an R6 class. This GitHub
> repo
> | contains a full MWE, with log files and a more elaborate explanation:
> | https://github.com/BjarkeHautop/RCMDcheckFalsePositive
> |
> | The R package contains a single .R file with this (I'm aware you don't
> have
> | to import base packages explicitly, but this is an MWE with only base
> | packages (except R6)):
> |
> | filter <- function() {
> | message("This is a custom filter function.")
> | }
> |
> | DataProcessor <- R6::R6Class(
> | "DataProcessor",
> | public = list(
> | data = NULL,
> | initialize = function(data) self$data <- data,
> |
> | filter_data = function(data) {
> | filter()
> | self$data <- stats::filter(self$data, rep(1, 3))
> | }
> | )
> | )
> |
> | When running R CMD check, it will generate the following NOTE:
> |
> | * checking dependencies in R code ... NOTE
> | Namespaces in Imports field not imported from:
> | ‘R6’ ‘stats’
>
> Thanks for posting a full and complete example! From a quick glance your
> problem may be that while you DO have the the packages in DESCRIPTION you
> DO NOT import them in NAMESPACE. The error message could arguably be more
> explicit but that seems to be the case here.
>
> Hope this helps, Dirk
>
> | Interestingly, the NOTE disappears on CRAN release/dev winbuilder.
> |
> | My questions are:
> |
> | 1. Is this the intended behavior of R CMD check, or is it a bug that it
> | fails to detect usage of packages inside
> | R6 classes? If intended (e.g., due to it being too expensive to check for
> | :: in "hidden places") should this be
> | mentioned somewhere on WRE? Currently
> | [WRE](
> |
> https://cran.r-project.org/doc/manuals/r-devel/R-exts.html#Package-Dependencies-1
> )
> | says:
> | *"The ‘Imports’ field should not contain packages which are not imported
> | from (via the NAMESPACE file or :: or ::: operators)"*
> | indicating that `::` usage should be fully supported.
> |
> | 2. How/Why does the NOTE disappear when checking on CRAN dev winbuilder?
> | Can I replicate this behavior locally using R CMD check? Will it pass on
> | CRAN?
> |
> | Best regards,
> | Bjarke
> |
> | [[alternative HTML version deleted]]
> |
> | ______________________________________________
> | [email protected] mailing list
> | https://stat.ethz.ch/mailman/listinfo/r-package-devel
>
> --
> dirk.eddelbuettel.com | @eddelbuettel | [email protected]
>
> ______________________________________________
> [email protected] mailing list
> https://stat.ethz.ch/mailman/listinfo/r-package-devel
>
[[alternative HTML version deleted]]
______________________________________________
[email protected] mailing list
https://stat.ethz.ch/mailman/listinfo/r-package-devel