RFC: enhancement for sapply() : do.names

About this list Date view Thread view Subject view Author view Other groups

Subject: RFC: enhancement for sapply() : do.names
From: Martin Maechler (maechler@stat.math.ethz.ch)
Date: Sat 25 Sep 1999 - 03:02:00 EST


Message-Id: <199909241702.TAA12166@sophie.ethz.ch>

Among other uses of sapply(), I use to use it for
"analyzing" / "summarizing" components of a list or to `summarize' objects
in my search path,
typically such as

sapply(obj.names, function(n){ r <- get(n); unlist(r[c("x","y","par")]) })

which gives a list or a 3-col matrix (depending if "x", "y","par" have always
same length..) that has no (row)names unfortunately, even though it's clear
that I would want my initial names...

  for(n in 1:3)
          assign(paste("o",n,sep=""), list(x=n,y=n^2,par=n/4))
  (obj.n <- paste("o",1:3,sep=""))
  sapply(obj.n, function(n){ unlist(get(n)[c("x","y","par")]) })

which gives

        [,1] [,2] [,3]
    x 1.00 2.0 3.00
    y 1.00 4.0 9.00
    par 0.25 0.5 0.75

but I would want

          o1 o2 o3
    x 1.00 2.0 3.00
    y 1.00 4.0 9.00
    par 0.25 0.5 0.75

----
I can get this with the following patch :

--- sapply.R 1999/01/29 17:39:28 1.3 +++ sapply.R 1999/09/24 16:12:53 @@ -1,8 +1,10 @@ -sapply <- function(X, FUN, ..., simplify = TRUE) +sapply <- function(X, FUN, ..., simplify = TRUE, do.names = TRUE) { FUN <- match.fun(FUN) - answer <- lapply(as.list(X), FUN, ...) + if(do.names && is.null(names(answer))) { # create names if sensible + if(is.character(X)) names(answer) <- X + } if(simplify && length(answer) && length(common.len <- unique(unlist(lapply(answer, length)))) == 1) { if(common.len == 1)

---------------

Now, before implementing this:

1) is "do.names" proper naming or should we rather use "DO.NAMES", "USE.NAMES", ... (at the moment, I'd prefer USE.NAMES)

2) Inside the new if(do.names ....) { .... } clause, we can try harder, e.g.,

if(do.names && is.null(names(answer))) { # create names if sensible names(answer) <- if(is.character(X)) X else abbreviate(deparse(substitute(X))) }

- actually this wouldn't always work as desired; `substitute(X)' would have to be saved before the first use of X ( evaluation of expressions...) - In that case, do.names (or USE.NAMES) should probably have the default is.character(X) -- for efficiency & back-compatibility

Opinions?

Martin Maechler <maechler@stat.math.ethz.ch> http://stat.ethz.ch/~maechler/ Seminar fuer Statistik, ETH-Zentrum LEO D10 Leonhardstr. 27 ETH (Federal Inst. Technology) 8092 Zurich SWITZERLAND phone: x-41-1-632-3408 fax: ...-1228 <>< -.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.- r-devel mailing list -- Read http://www.ci.tuwien.ac.at/~hornik/R/R-FAQ.html Send "info", "help", or "[un]subscribe" (in the "body", not the subject !) To: r-devel-request@stat.math.ethz.ch _._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._


About this list Date view Thread view Subject view Author view Other groups

This archive was generated by hypermail 2b25 : Tue 04 Jan 2000 - 14:16:08 EST