I reckon it was just written before R6 and could go for a patch: https://gitlab.com/luke-tierney/codetools
Point taken about masking. Working from memory (CMIIW) you can just import and name from stats to satisfy the static analysis: importFrom(stats, setNames) R doesn't do two-way "include what you use" checks to insure the names you import are actually used. Mike C On Thu, Feb 12, 2026, 11:33 PM Bjarke Hautop <[email protected]> wrote: > Sorry, clicked send too soon! > > > It could find 'stats::' if it looked at > > > > body(getNamespace(<pkg>)$DataProcessor$public_methods$filter_data)[[3]][[3]][[1]] > > Is there a reason why it doesn't do this? Is it just for computational > reasons? > > Best regards, > Bjarke > > Den tors. 12. feb. 2026 kl. 23.53 skrev Michael Chirico < > [email protected]>: > >> 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
