Lenth, Russell V
2022-Jun-24 00:45 UTC
[Rd] [External] Re: svd() results should have a class
Duncan et al., The real example would be the estimability package, in which there is a generic function nonest.basis and methods for classes lm, matrix, and qr. I wanted to add a method for class svd except there is no such class. I agree BTW that the safe thing to do would be to have the returned object be of class c("svd", "list"). Best, Russ -----Original Message----- From: Duncan Murdoch <murdoch.duncan at gmail.com> Sent: Thursday, June 23, 2022 7:23 PM To: Lenth, Russell V <russell-lenth at uiowa.edu>; Robert Harlow <rharlow86 at gmail.com> Cc: r-devel at r-project.org Subject: Re: [Rd] [External] Re: svd() results should have a class On 23/06/2022 8:07 p.m., Lenth, Russell V wrote:> Bob, > > I'm not talking about using svd as a generic method. I am talking > about a method FOR svd results, e.g. an S3 method like foo.svd(), for > which there already exist other methods, say foo.default and foo.qr. > Currently if I wanted to do > > svdobj <- svd(x) > foo(svdobj) > > it would not dispatch correctly because there is no svd class. Instead, it would be handled by foo.list if it exists, and it is certainly not clear that foo.list would do the right thing.I think this would be more convincing if you gave a real example. You can see the existing methods for the "qr" and "eigen" classes using methods(class = "qr") methods(class = "eigen") When I do it, I think I'm only seeing methods from base packages, and they are: kappa for qr solve for qr print for eigen I think the default print method works fine for svd() results. kappa.svd would probably make sense, but would need some thought: calculating kappa on a matrix and using the help page for kappa to naively calculate it from the svd() of that matrix give different results: > set.seed(123) > X <- matrix(rnorm(25), 5,5) > kappa(X) [1] 90.71283 > s <- svd(X) > s$d[1]/s$d[length(s$d)] [1] 62.68048 Duncan Murdoch> Russ > > Sent from my iPad > > On Jun 23, 2022, at 6:53 PM, Robert Harlow <rharlow86 at gmail.com> wrote: > > ? > Don't have a view on whether it makes sense in base R or not, but WRE section 7.1 may be helpful to you: https://cran.r-project.org/doc/manuals/R-exts.html#Adding-new-generics. > > It's not uncommon for packages to want to make base methods generic and the above link provides advice on how to do so. > > Bob > > On Thu, Jun 23, 2022 at 12:07 PM Lenth, Russell V <russell-lenth at uiowa.edu<mailto:russell-lenth at uiowa.edu>> wrote: > Dear R-Devel, > > I noticed that if we run base::svd(x), we obtain an object of class "list". Shouldn't there be an "svd" class, in case someone (e.g., me) wants to write methods for singular value decompositions? Note that other matrix-decomposition routines like qr() and eigen() each return objects having those names. > > Thanks > > Russ Lenth > Russell-lenth at uiowa.edu<mailto:Russell-lenth at uiowa.edu> > > [[alternative HTML version deleted]] > > ______________________________________________ > R-devel at r-project.org<mailto:R-devel at r-project.org> mailing list > https://stat.ethz.ch/mailman/listinfo/r-devel > > [[alternative HTML version deleted]] > > ______________________________________________ > R-devel at r-project.org mailing list > https://stat.ethz.ch/mailman/listinfo/r-devel
Martin Maechler
2022-Jun-24 08:41 UTC
[Rd] [External] Re: svd() results should have a class
>>>>> Lenth, Russell V >>>>> on Fri, 24 Jun 2022 00:45:21 +0000 writes:> Duncan et al., > The real example would be the estimability package, in which there is a generic function nonest.basis and methods for classes lm, matrix, and qr. I wanted to add a method for class svd except there is no such class. > I agree BTW that the safe thing to do would be to have the returned object be of class c("svd", "list"). Well.. "safe" is relative here. Practically *all* S3 classes are internally lists (notable exceptions: "Date", "PosixCT") and we never (AFAIR) append "list" to the class vector in such cases. Martin > Best, > Russ > -----Original Message----- > From: Duncan Murdoch <murdoch.duncan at gmail.com> > Sent: Thursday, June 23, 2022 7:23 PM > To: Lenth, Russell V <russell-lenth at uiowa.edu>; Robert Harlow <rharlow86 at gmail.com> > Cc: r-devel at r-project.org > Subject: Re: [Rd] [External] Re: svd() results should have a class > On 23/06/2022 8:07 p.m., Lenth, Russell V wrote: >> Bob, >> >> I'm not talking about using svd as a generic method. I am talking >> about a method FOR svd results, e.g. an S3 method like foo.svd(), for >> which there already exist other methods, say foo.default and foo.qr. >> Currently if I wanted to do >> >> svdobj <- svd(x) >> foo(svdobj) >> >> it would not dispatch correctly because there is no svd class. Instead, it would be handled by foo.list if it exists, and it is certainly not clear that foo.list would do the right thing. > I think this would be more convincing if you gave a real example. You can see the existing methods for the "qr" and "eigen" classes using > methods(class = "qr") > methods(class = "eigen") > When I do it, I think I'm only seeing methods from base packages, and they are: > kappa for qr > solve for qr > print for eigen > I think the default print method works fine for svd() results. > kappa.svd would probably make sense, but would need some thought: > calculating kappa on a matrix and using the help page for kappa to naively calculate it from the svd() of that matrix give different results: >> set.seed(123) >> X <- matrix(rnorm(25), 5,5) >> kappa(X) > [1] 90.71283 >> s <- svd(X) >> s$d[1]/s$d[length(s$d)] > [1] 62.68048 > Duncan Murdoch >> Russ >> >> Sent from my iPad >> >> On Jun 23, 2022, at 6:53 PM, Robert Harlow <rharlow86 at gmail.com> wrote: >> >> ? >> Don't have a view on whether it makes sense in base R or not, but WRE section 7.1 may be helpful to you: https://cran.r-project.org/doc/manuals/R-exts.html#Adding-new-generics. >> >> It's not uncommon for packages to want to make base methods generic and the above link provides advice on how to do so. >> >> Bob >> >> On Thu, Jun 23, 2022 at 12:07 PM Lenth, Russell V <russell-lenth at uiowa.edu<mailto:russell-lenth at uiowa.edu>> wrote: >> Dear R-Devel, >> >> I noticed that if we run base::svd(x), we obtain an object of class "list". Shouldn't there be an "svd" class, in case someone (e.g., me) wants to write methods for singular value decompositions? Note that other matrix-decomposition routines like qr() and eigen() each return objects having those names. >> >> Thanks >> >> Russ Lenth >> Russell-lenth at uiowa.edu<mailto:Russell-lenth at uiowa.edu> >> >> [[alternative HTML version deleted]] >> >> ______________________________________________ >> R-devel at r-project.org<mailto:R-devel at r-project.org> mailing list >> https://stat.ethz.ch/mailman/listinfo/r-devel >> >> [[alternative HTML version deleted]] >> >> ______________________________________________ >> R-devel at r-project.org mailing list >> https://stat.ethz.ch/mailman/listinfo/r-devel > ______________________________________________ > R-devel at r-project.org mailing list > https://stat.ethz.ch/mailman/listinfo/r-devel