Serguei,

> On 17/04/2020, at 2:24 AM, Sokol Serguei <so...@insa-toulouse.fr> wrote:
> 
> 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.


It's not in any way "neater", not only is it less readable, it's just plain 
wrong. What if the expression returned a function? How do you know that you 
don't want to apply the result of the call? For the same reason the 
implementation below won't work - very often you just pass a symbol that 
evaluates to a function and always en expression that returns a function and 
there is no way to distinguish that from your new proposed syntax. When you 
feel compelled to use substitute() you should hear alarm bells that something 
is wrong ;).

You can certainly write a new function that uses a different syntax (and I'm 
sure someone has already done that in the package space), but what you propose 
is incompatible with *apply in R (and very much not R syntax).

Cheers,
Simon


> 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
> 

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

Reply via email to