Re: [Rd] Attributes of 1st argument in ...

From: Martin Maechler <maechler_at_stat.math.ethz.ch>
Date: Mon, 05 Jul 2010 11:47:01 +0200

>>>>> "DM" == Daniel Murphy <chiefmurphy_at_gmail.com>
>>>>> on Sun, 4 Jul 2010 11:11:43 -0700 writes:

    DM> Thank you, Professor, for drawing my attention to the nifty tracemem
    DM> function. I'm using the ..1 syntax to check the properties of the S4 class
    DM> at function call.

    DM> The Description at ?"cBind" tells me that I'm not alone in this predicament.

    DM> Just as Matrix needs its own cBind function, my package will need its own
    DM> cbindMondate function. Alas, subclasses of mondate will also need their own
    DM> binding functions, thus defeating one of the purposes of the class paradigm
    DM> (for binding, anyway).

I don't think you see the full picture:

Matrix::cBind() builds on methods::cbind2()

and cbind2 / rbind2 are there (in package methods) for you to use setMethod() on them.

BTW: When Matrix::cBind() -- and cbind2 / rbind2 in package

     methods were written,

R did not have the possibility yet to write methods for "...", which it now does.

In the package Rmpfr (arbitrary-precision number ["mpfr"] computing), where I also define methods for matrices of such "mpfr" numbers (classes "mpfrMatrix" and "mpfrArray"),
I use the new feature of defining methods for "..." :

setGeneric("cbind", signature = "...")

setMethod("cbind", "Mnumber",

	  function(..., deparse.level = 1) {
	      args <- list(...)
	      if(all(sapply(args, is.atomic)))
		  return( base::cbind(..., deparse.level = deparse.level) )
	      ## else: at least one is "mpfr(Matrix/Array)"

	      if(any(sapply(args, is.character))) {
		  ## result will be  <character> matrix !
		  isM <- sapply(args, is, class2 = "mpfr")
		  args[isM] <- lapply(args[isM], as, Class = "character")
		  return(do.call(base::cbind,
				 c(args, list(deparse.level=deparse.level))))

	      } else if(any(sapply(args, is.complex))) {
		  ## result will be  <complex> matrix;
		  ## in the future <complex_mpfr>  ???

		  stop("cbind(...) of 'complex' and 'mpfr' objects is not implemented")
		  ## give at least warning !!
              }
              ## else

     ..........
     ..........

  })

where I use a useful class union

  setClassUnion("Mnumber",

		members = c("array_or_vector", # *but* must be numeric-like
		"mpfr", "mpfrArray", "mpfrMatrix"))


As always, I'd recommend to read the R source, rather than just investigate the installed package.
You can get the *source* tarbal, i.e., the *.tar.gz file from CRAN, or, as it's all on R-forge,

     http://rmpfr.r-forge.r-project.org/ you can get the source tarball here,

   https://r-forge.r-project.org/R/?group_id=386 or browse the source at

   https://r-forge.r-project.org/scm/viewvc.php/pkg/?root=rmpfr

But if I were you I'd get it via

   svn checkout svn://svn.r-forge.r-project.org/svnroot/rmpfr/pkg Rmpfr

    DM> As an aside, I wonder why, on around line 75, cBind uses 'rep.int("",     DM> ncol(r))' rather than the slightly faster 'character(ncol(r))'.

Well, I would not remember, but the first one is a more self-explaining, ... and I would guess strongly that time difference is irrelevant in the context where it's used... ... but then thanks for your hint :-)

Martin

    DM> Thanks again,
    DM> Dan

    DM> On Sun, Jul 4, 2010 at 4:36 AM, Prof Brian Ripley <ripley_at_stats.ox.ac.uk>wrote:

    >> I think you have missed the use of ..1 etc: see e.g. cBind() in package
    >> Matrix.
    >> 
    >> So x <- attr(list(...)[[1L]], "foo") can be x <- attr(..1, "foo")
    >> 
    >> As for 'extra copying', it all depends on exactly what you are doing, but
    >> compare
    >> 
    >> foo1 <- function(...) length(..1)
    >>> foo2 <- function(...) length(list(...)[[1L]])
    >>> tracemem(x <- runif(1000))
    >>> 
    >> [1] "<0x1b27800>"
    >> 
    >>> foo1(x)
    >>> 
    >> [1] 1000
    >> 
    >>> tracemem(x <- runif(1000))
    >>> 
    >> [1] "<0x1b29800>"
    >> 
    >>> foo2(x)
    >>> 
    >> tracemem[0x1b29800 -> 0x10a2200]: foo2
    >> [1] 1000
    >> 
    >> 
    >> 
    >> <snip>
    >> --
    >> Brian D. Ripley,                  ripley_at_stats.ox.ac.uk
    >> Professor of Applied Statistics,  http://www.stats.ox.ac.uk/~ripley/
    >> University of Oxford,             Tel:  +44 1865 272861 (self)
    >> 1 South Parks Road,                     +44 1865 272866 (PA)
    >> Oxford OX1 3TG, UK                Fax:  +44 1865 272595
    >> 

    DM> [[alternative HTML version deleted]]

    DM> ______________________________________________
    DM> R-devel_at_r-project.org mailing list     DM> 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 Mon 05 Jul 2010 - 10:15:00 GMT

Archive maintained by Robert King, hosted by the discipline of statistics at the University of Newcastle, Australia.
Archive generated by hypermail 2.2.0, at Tue 06 Jul 2010 - 07:00:11 GMT.

Mailing list information is available at https://stat.ethz.ch/mailman/listinfo/r-devel. Please read the posting guide before posting to the list.

list of date sections of archive