Hi,

I would like to make a suggestion for a small syntactic modification of FUN argument in the family of functions [lsv]apply(). The idea is to allow one-liner expressions without typing "function(item) {...}" to surround them. The argument to the anonymous function is simply referred as ".". Let take an example. With this new feature, the following call

sapply(split(mtcars, mtcars$cyl), function(d) summary(lm(mpg ~ wt, d))$r.squared)
#        4         6         8
#0.5086326 0.4645102 0.4229655


could be rewritten as

sapply(split(mtcars, mtcars$cyl), summary(lm(mpg ~ wt, .))$r.squared)

"Not a big saving in typing" you can say but multiplied by the number of [lsv]apply usage and a neater look, I think, the idea merits to be considered. To illustrate a possible implementation, I propose a wrapper example for sapply():

wsapply=function(l, fun, ...) {
    s=substitute(fun)
    if (is.name(s) || is.call(s) && s[[1]]==as.name("function")) {
        sapply(l, fun, ...) # legacy call
    } else {
        sapply(l, function(d) eval(s, list(.=d)), ...)
    }
}

Now, we can do:

wsapply(split(mtcars, mtcars$cyl), summary(lm(mpg ~ wt, .))$r.squared)

or, traditional way:

wsapply(split(mtcars, mtcars$cyl), function(d) summary(lm(mpg ~ wt, d))$r.squared)

the both work.

How do you feel about that?

Best,
Serguei.

______________________________________________
R-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel

Reply via email to