Re: [Rd] s4 generic issue

From: John Chambers <jmc_at_r-project.org>
Date: Wed, 04 Nov 2009 10:22:31 -0800

If you mean us to run the code you supplied:

  1. There are two generic backsolve() functions, one in the gobal environment and one in SparseM:

 > showMethods(backsolve)
Function: backsolve (package .GlobalEnv) r="ANY"
r="matrix"

    (inherited from: r="ANY")

 > showMethods(SparseM::backsolve)
Function: backsolve (package SparseM)
r="ANY"
r="matrix.csr.chol"

2. Package "lars" does not (unfortunately) have a NAMESPACE, so calls from lars will get the version without a special method. This is generally a recipe for trouble, but does not seem to be the issue in this case.

3. A little inspection with options(error=recover) suggests the computations screwed up some time before the actual call here (the rather opaque error message is complaining because the x argument, returned by backsolvet(), has NaNs and an Inf in it). Since backsolvet() calls backsolve() with transpose=TRUE, it won't be happy with your default method, which ignores the transpose= argument. Did you really mean to do that? (Again, this would not show up in lars if that package had a NAMESPACE).

I think the last point may explain your problem. It has nothing to do with S4 generics, only with the general "keep it simple" advice.

Cheers,
 John

Roger Koenker wrote:
> I'm hoping that someone with deeper insight into S4 than I,
> that is to say virtually everyone reading this list, could help
> resolve the following problem in SparseM. We have
>
> setGeneric("backsolve",
> function(r, x, k = NULL, upper.tri = NULL, transpose = NULL,
> twice = TRUE, ...)
> standardGeneric("backsolve"),
> useAsDefault= function(r, x, k = ncol(r), upper.tri = TRUE,
> transpose = FALSE, twice = TRUE, ...)
> base::backsolve(r, x, k = ncol(r), upper.tri = TRUE,
> transpose = FALSE, ...))
>
> and then proceed to use setMethod for a class matrix.csr.chol.
> However, this seems
> to cause problems in the following instance: if one does the following
>
> require(lars)
> require(SparseM)
> example(lars)
> ....[snip]
> lars> object3 <- lars(x,y,type="for") # Can use abbreviations
> Error in base::backsolve(r, x, k = ncol(r), upper.tri = TRUE,
> transpose = FALSE, :
> NA/NaN/Inf in foreign function call (arg 4)
> > traceback()
> 10: .C("bakslv", t = r, ldt = nrow(r), n = k, b = x, ldb = k, nb = nb,
> x = matrix(0, k, nb), job = job, info = integer(1L), DUP = FALSE,
> PACKAGE = "base")
> 9: base::backsolve(r, x, k = ncol(r), upper.tri = TRUE, transpose =
> FALSE,
> ...)
> 8: backsolve(R, backsolvet(R, Sign[positive]))
> 7: backsolve(R, backsolvet(R, Sign[positive]))
> 6: nnls.lars(active, Sign, R, directions, Gram[active, active],
> trace = trace, use.Gram = TRUE, eps = eps)
> 5: lars(x, y, type = "for")
> 4: eval.with.vis(expr, envir, enclos)
> 3: eval.with.vis(ei, envir)
> 2: source(zfile, local, echo = echo, prompt.echo = paste(prompt.prefix,
> getOption("prompt"), sep = ""), continue.echo =
> paste(prompt.prefix,
> getOption("continue"), sep = ""), verbose = verbose,
> max.deparse.length = Inf,
> encoding = encoding, skip.echo = skips, keep.source = TRUE)
> 1: example(lars)
>
> So clearly base::backsolve is getting called as would be desired in
> this case,
> but something is rotten in the way arguments are being passed.
>
> I'm aware that the R-extensions manual suggests another strategy than
> setGeneric for making generics, but I would like to understand what is
> going
> wrong here.
>
> Roger
>
>
> url: www.econ.uiuc.edu/~roger Roger Koenker
> email rkoenker_at_uiuc.edu Department of Economics
> vox: 217-333-4558 University of Illinois
> fax: 217-244-6678 Urbana, IL 61801
>
> ______________________________________________
> 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 Received on Wed 04 Nov 2009 - 18:25:22 GMT

This archive was generated by hypermail 2.2.0 : Wed 04 Nov 2009 - 19:50:20 GMT