[R-pkg-devel] Exporting S3 methods for base generics
Could you point to one of these packages you refer to? I'm still having problems and not sure why at the moment. Thanks
On Mon, Jun 26, 2017 at 12:32 PM, Joris Meys <Joris.Meys at ugent.be> wrote:
Hi Charles,
my mistake. I forgot that pmax has an extra argument na.rm. I'm surprised
you could define the method, as this normally should return an error from
conformMethod().
So:
#' @rdname pmax
setGeneric("pmax", signature = "...")
should work. I've used this myself in quite a number of packages.
Cheers
Joris
On Mon, Jun 26, 2017 at 7:20 PM, Charles Determan <cdetermanjr at gmail.com>
wrote:
Thanks for the reply Joris, although I am not sure what I could be doing wrong. I implement exactly the lines you show and yet I just get the following error when I call 'pmax' on the class.
pmax(x, 0)
Error in mmm < each : comparison (3) is possible only for atomic and list types In addition: Warning message: In is.na(mmm) : is.na() applied to non-(list or vector) of type 'S4' Regards, Charles On Mon, Jun 26, 2017 at 12:10 PM, Joris Meys <Joris.Meys at ugent.be> wrote:
Hi Charles,
if a generic exists already in the base, you only have to export the
actual S3 method. Your problem is that base::pmax() is not a generic S3
function. So R gives you the correct warning: the S3 generic in your
package will always mask the base pmax function. And that's not really a
problem, especially since you ensured the base functionality with your
default method.
If you want to avoid that warning, use S4.
#' @rdname
setGeneric("pmax")
#' @rdname pmax
#' @method pmax myclass
#' @export
setMethod("pmax",
"myclass",
function(...){
# do some stuff
})
More information on how to deal with dots can be found on the help page
?dotsMethods.
If you have a generic in the base package (eg plot is such one), you
only define the method and use:
#' @export
plot.myclass <- function(x, y, ...){
# do some more stuff
}
Cheers
Joris
On Mon, Jun 26, 2017 at 6:28 PM, Charles Determan <cdetermanjr at gmail.com
wrote:
Greetings R users,
I was wondering how others are exporting S3 methods in their packages
when
the generic is in 'base'. For example, let's say I want to export a new
pmax method. The only way I have found to get this to work is by
redefining the function with 'UseMethod' and setting the default method.
#' @export
pmax <- function(...){ UseMethod("pmax") }
#' @export
pmax.default <- function(..., na.rm=FALSE){ base::pmax(...,
na.rm=FALSE) }
setClass("myclass")
#' @export
pmax.myclass <- function(..., na.rm = FALSE){
print('myclass pmax!')
}
Although this works, I get the 'warning'
The following objects are masked from 'package:base':
pmax
I would like the package build and loading to be as clean as possible
but
if this is acceptable and not considered a problem I will let it go. It
just seems odd that one would to redefine a the generic when in states
in
the docs for 'pmax' that it will also work on classed S3 objects but
perhaps I am reading this incorrectly.
Thanks,
Charles
[[alternative HTML version deleted]]
______________________________________________ R-package-devel at r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-package-devel
-- Joris Meys Statistical consultant Ghent University Faculty of Bioscience Engineering Department of Mathematical Modelling, Statistics and Bio-Informatics tel : +32 9 264 59 87 <+32%209%20264%2059%2087> Joris.Meys at Ugent.be ------------------------------- Disclaimer : http://helpdesk.ugent.be/e-maildisclaimer.php
-- Joris Meys Statistical consultant Ghent University Faculty of Bioscience Engineering Department of Mathematical Modelling, Statistics and Bio-Informatics tel : +32 9 264 59 87 <+32%209%20264%2059%2087> Joris.Meys at Ugent.be ------------------------------- Disclaimer : http://helpdesk.ugent.be/e-maildisclaimer.php