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


______________________________________________
R-help@r-project.org mailing list -- To UNSUBSCRIBE and more, see
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.

Reply via email to