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

Charles C. Berry ccberry at ucsd.edu
Tue Mar 28 04:26:55 CEST 2017

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 )



More information about the R-devel mailing list