From b.rowlingson at lancaster.ac.uk  Mon Mar 27 17:21:29 2017
From: b.rowlingson at lancaster.ac.uk (Barry Rowlingson)
Date: Mon, 27 Mar 2017 16:21:29 +0100
Subject: [Rd] A trap for young players with the lapply() function.
In-Reply-To: <4e15ccb966c041f68ea042459324d02c@EX-0-HT0.lancs.local>
References: <4e15ccb966c041f68ea042459324d02c@EX-0-HT0.lancs.local>
Message-ID: <CANVKczOEg6e3b7U1rYd1nQzJQOtxXGc+e=6cvHJJVFSsxcovAQ@mail.gmail.com>

On Mon, Mar 27, 2017 at 1:17 AM, Rolf Turner <r.turner at auckland.ac.nz> wrote:
>
> Is there any way to trap/detect the use of an optional argument called
> "X" and thereby issue a more perspicuous error message?
>
> This would be helpful to those users who, like myself, are bears of very
> little brain.
>
> Failing that (it does look impossible)

You can get the names of named arguments:

 > z = function(x,X){cos(x*X)}
 > names(formals(z))
 [1] "x" "X"


> might it not be a good idea to
> add a warning to the help for lapply(), to the effect that if FUN has an
> optional argument named "X" then passing this argument via "..." will
> cause this argument to be taken as the first argument to lapply() and
> thereby induce an error?

Another idea might be to use purrr:map instead, which is quite happy
with X in your function:

 >  xxx <- purrr::map(y,function(x,X){cos(x*X)},X=2*pi)
 > xxx
[[1]]
[1] 0.08419541

[[2]]
[1] 0.6346404

[[3]]
[1] 0.9800506

[[4]]
[1] 0.8686734

[[5]]
[1] -0.9220073

But don't feed `.x` to your purrrring cats, or fails silently:

 >  xxx <- purrr::map(y,function(x,.x){cos(x*.x)},.x=2*pi)
 > xxx
[[1]]
NULL

But who would have a function with `.x` as an argument?


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



[Rd] A trap for young players with the lapply() function.
Barry Rowlingson