On 28/03/17 15:26, Charles C. Berry wrote:
On Mon, 27 Mar 2017, Rolf Turner wrote:
From time to time I get myself into a state of bewilderment when using
apply() by calling it with FUN equal to a function which has an
"optional" argument named "X".
E.g.
xxx <- lapply(y,function(x,X){cos(x*X)},X=2*pi)
which produces the error message
Error in get(as.character(FUN), mode = "function", envir = envir) :
object 'y' of mode 'function' was not found
This of course happens because the name of the first argument of
lapply() is "X" and so it takes the value of this first argument to be
the supplied X (2*pi in the foregoing example) and then expects what
the user has denoted by "y" to be the value of FUN, and (obviously!)
it isn't.
The lapply help page addresses this issue in `Details' :
"it is good practice to name the first two arguments X and FUN if ... is
passed through: this both avoids partial matching to FUN and ensures
that a sensible error message is given if arguments named X or FUN are
passed through ..."
So that advice suggests something like:
xxx <- lapply( X=y, FUN=function(X,x){cos(X*x)}, x=2*pi )
That is of course very sound advice, but it pre-supposes that the user
is *aware* that there is a pitfall to be avoided. I was hoping for
something that would protect dweebs like myself from the pitfall given
that we are too obtuse to be cognizant of its existence.
I think that the suggestion I made, in response to a posting by Barry
Rowlingson, that the first argument of lapply() be given the name of
".X" rather than just-plain-X, would be (a) effective, and (b) harmless.
cheers,
Rolf
--
Technical Editor ANZJS
Department of Statistics
University of Auckland
Phone: +64-9-373-7599 ext. 88276
______________________________________________
R-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel