I'm getting an R CMD check warning with a package (call it package A) that defines an S3 method but not the generic. The generic is defined in another package (package B). Package A imports the S3 generic from B. And there's one additional detail: the generic overrides a function in the stats package. I've created a minimal test package which reproduces the problem: https://github.com/wch/s3methodtest In this case: - the package imports dplyr, for the dplyr::filter S3 generic - the package defines a S3 method filter.test - it imports dplyr, which defines a filter S3 generic The warning doesn't occur when package dplyr is in Depends instead of Imports. It also doesn't occur if the method is for a generic that does not override an existing function like stats::filter. For example, if instead of filter.test, I define select.test (dplyr::select is also an S3 generic), then there's no warning. This warning seems incorrect. Is this a bug? I'm interested in submitting the package to CRAN soon, so any advice on what to do is appreciated. Thanks, -Winston
I forgot to add this - here's the warning: * checking S3 generic/method consistency ... WARNING Warning: declared S3 method 'filter.test' not found See section 'Generic functions and methods' of the 'Writing R Extensions' manual. On Tue, Jun 17, 2014 at 2:21 PM, Winston Chang <winstonchang1 at gmail.com> wrote:> I'm getting an R CMD check warning with a package (call it package A) > that defines an S3 method but not the generic. The generic is defined > in another package (package B). Package A imports the S3 generic from > B. And there's one additional detail: the generic overrides a function > in the stats package. > > I've created a minimal test package which reproduces the problem: > https://github.com/wch/s3methodtest > > In this case: > - the package imports dplyr, for the dplyr::filter S3 generic > - the package defines a S3 method filter.test > - it imports dplyr, which defines a filter S3 generic > > The warning doesn't occur when package dplyr is in Depends instead of > Imports. It also doesn't occur if the method is for a generic that > does not override an existing function like stats::filter. For > example, if instead of filter.test, I define select.test > (dplyr::select is also an S3 generic), then there's no warning. > > This warning seems incorrect. Is this a bug? I'm interested in > submitting the package to CRAN soon, so any advice on what to do is > appreciated. > > Thanks, > -Winston
When you provide a method for a generic function imported from another package then the generic must be on the search path. Otherwise if a user types "filter" the dispatch to "filter.test" will never occur. What is happening here is worse because "filter" is a non-generic function in the stats package which is always on the search path. As you note, using "Depends: dplyr" works because it attaches dplyr to the search path before your test package is loaded. If you use "Imports" instead then you need to re-export the generic "filter" function from your package namespace. You will also need to document the generic function in your package. A minimal functioning help page that cross-references to the dplyr package should be sufficient (Note that S4 generics get a free pass here and do not need to be documented when re-exported, but S3 generics do). Martyn On Tue, 2014-06-17 at 14:21 -0500, Winston Chang wrote:> I'm getting an R CMD check warning with a package (call it package A) > that defines an S3 method but not the generic. The generic is defined > in another package (package B). Package A imports the S3 generic from > B. And there's one additional detail: the generic overrides a function > in the stats package. > > I've created a minimal test package which reproduces the problem: > https://github.com/wch/s3methodtest > > In this case: > - the package imports dplyr, for the dplyr::filter S3 generic > - the package defines a S3 method filter.test > - it imports dplyr, which defines a filter S3 generic > > The warning doesn't occur when package dplyr is in Depends instead of > Imports. It also doesn't occur if the method is for a generic that > does not override an existing function like stats::filter. For > example, if instead of filter.test, I define select.test > (dplyr::select is also an S3 generic), then there's no warning. > > This warning seems incorrect. Is this a bug? I'm interested in > submitting the package to CRAN soon, so any advice on what to do is > appreciated. > > Thanks, > -Winston > > ______________________________________________ > R-devel at r-project.org mailing list > https://stat.ethz.ch/mailman/listinfo/r-devel----------------------------------------------------------------------- This message and its attachments are strictly confidenti...{{dropped:8}}
Possibly Parallel Threads
- R CMD check and missing imports from base packages
- Rebuilding and re-checking of downstream dependencies on CRAN Mac build machines
- R CMD check warning about compiler warning flags
- dowload.file(method="libcurl") and GET vs. HEAD requests
- R CMD check warning about compiler warning flags