Skip to content

Strange behaviour of R?

9 messages · Rainer M Krug, Sigbert Klinke, Kimmo Elo +3 more

#
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?

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
#
Hi
Not for me - macOS, R 3.6.2
Fails as expected,

Rainer
--
Rainer M. Krug, PhD (Conservation Ecology, SUN), MSc (Conservation Biology, UCT), Dipl. Phys. (Germany)

Orcid ID: 0000-0002-7490-0066

Department of Evolutionary Biology and Environmental Studies
University of Z?rich
Office Y34-J-74
Winterthurerstrasse 190
8075 Z?rich
Switzerland

Office:	+41 (0)44 635 47 64
Cell:       	+41 (0)78 630 66 57
email:      Rainer.Krug at uzh.ch
		Rainer at krugs.de
Skype:     RMkrug

PGP: 0x0F52F982
#
Hi
Not for me - macOS, R 3.6.2
Fails as expected,

Rainer
--
Rainer M. Krug, PhD (Conservation Ecology, SUN), MSc (Conservation Biology, UCT), Dipl. Phys. (Germany)

Orcid ID: 0000-0002-7490-0066

Department of Evolutionary Biology and Environmental Studies
University of Z?rich
Office Y34-J-74
Winterthurerstrasse 190
8075 Z?rich
Switzerland

Office:	+41 (0)44 635 47 64
Cell:       	+41 (0)78 630 66 57
email: ? ? ?Rainer.Krug at uzh.ch <mailto:Rainer.Krug at uzh.ch>
		Rainer at krugs.de <mailto:Rainer at krugs.de>
Skype:     RMkrug

PGP: 0x0F52F982





--
Rainer M. Krug, PhD (Conservation Ecology, SUN), MSc (Conservation Biology, UCT), Dipl. Phys. (Germany)

Orcid ID: 0000-0002-7490-0066

Department of Evolutionary Biology and Environmental Studies
University of Z?rich
Office Y34-J-74
Winterthurerstrasse 190
8075 Z?rich
Switzerland

Office:	+41 (0)44 635 47 64
Cell:       	+41 (0)78 630 66 57
email:      Rainer.Krug at uzh.ch
		Rainer at krugs.de
Skype:     RMkrug

PGP: 0x0F52F982
#
Hi,

cannot reproduce, either, on my Linuxmint 19.3 + R 3.6.2.

Here the outputs:

--- snip ---
[1] 5.5
NULL
Error in FUN(args) : could not find function "FUN"
[1] NA
Warning message:
In mean.default(args) : argument is not numeric or logical: returning
NA

--- snip ---

Best,
Kimmo

pe, 2020-01-17 kello 09:21 +0100, Sigbert Klinke kirjoitti:
#
> Hi,
    > Am 17.01.20 um 08:42 schrieb Rainer M Krug:
    >> Not for me - macOS, R 3.6.2

    > Sorry, I forgot to add: Ubuntu 18.04.3 LTS, R 3.6.2

Sorry but that's very hard to believe, i.e.,
that such fundamental R behavior would depend on the exact OS
version ... unless you did compile (and link) R yourself *and*
are using somewhat peculiar compiler / linker / ... settings ?


Context : 

	> 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?

definitely not ok, and also not reproducible for me.
#
On 17/01/2020 2:33 a.m., Sigbert Klinke wrote:
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
#
Normally one uses match.fun to avoid such problems.
This will give the error shown even if FUN is defined in the global environment.

  test <- function(FUN, args) {
     FUN <- match.fun(FUN)
     print(FUN)
     FUN(args)
  }
  test(NULL, 1:10)
  ## Error in match.fun(FUN) : 'NULL' is not a function, character or symbol
On Fri, Jan 17, 2020 at 5:41 AM Duncan Murdoch <murdoch.duncan at gmail.com> wrote: