[R] Strange behaviour of R?

Duncan Murdoch murdoch@dunc@n @end|ng |rom gm@||@com
Fri Jan 17 11:40:07 CET 2020


On 17/01/2020 2:33 a.m., Sigbert Klinke wrote:
> Hi,
> 
> I wrote a function like
> 
> test <- function(FUN, args) {
>     print(FUN)
>     FUN(args)
> }
> 
> When I call it lieke this
> 
> test(mean, 1:10)
> test(NULL, 1:10)
> 
> then the second call still uses mean, although I set FUN to NULL. Is
> that ok?

You probably have a function defined in your global environment that is 
named FUN and acts like mean.

The general rule in R is that it only looks for objects of mode function 
when trying to find something used as a function.  So in your second 
case, when trying to evaluate FUN(args), R will look for a function 
named FUN in the local evaluation frame, and won't find one:  FUN is 
NULL there.  Then it will go to the environment of test, which is likely 
the global environment, and look there.  That's where it probably found 
the function.

For example, try this:

FUN <- function(...) print('FUN was called')


test <- function(FUN, args) {
    print(FUN)
    FUN(args)
}

test(NULL, 1:10)

Duncan Murdoch

> 
> Actually, I used something like
> 
> test(mean, list(x=1:10, na.rm=TRUE))
> 
> which actually crashed R, but I can not reproduce it. Of course, when I
> replaced FUN(args) with do.call(FUN, args) then everything works fine.
> 
> Sigbert
>



More information about the R-help mailing list