From murdoch.duncan at gmail.com  Thu Oct 22 23:56:57 2015
From: murdoch.duncan at gmail.com (Duncan Murdoch)
Date: Thu, 22 Oct 2015 17:56:57 -0400
Subject: [Rd] Changed behaviour when passing a function?
In-Reply-To: <CADwqtCOhnSCxfdydoNAr6RO55sWumV-f-eQa7TCcTPunMUCosw@mail.gmail.com>
References: <CAO1zAVb9azyYRR-fu5EKwzv0h9Rhu_tuL6oVtbyA1rW_5hAnFw@mail.gmail.com>
	<56295440.2080002@gmail.com>
	<CADwqtCOhnSCxfdydoNAr6RO55sWumV-f-eQa7TCcTPunMUCosw@mail.gmail.com>
Message-ID: <56295BA9.6020000@gmail.com>

On 22/10/2015 5:44 PM, Gabriel Becker wrote:
> Of course (and unsurprisingly) Duncan is correct.  I see that behavior 
> in R 3.1.0, as well as the modern ones Duncan mentioned.
>
> What I said is true, as far as it goes, but the symbol being resolved 
> is FUN, so when looking for a function it doesn't find the function 
> version of round.

It comes down to the order of operations:  we need to bind something to 
FUN, and we need to look up a function named FUN.  Since the binding 
comes first, it fails.  If it happened in the other order: look for a 
function named FUN,
find an unresolved binding to "round", look in the caller frame for a 
function named round, we wouldn't get the error.  But that's not how we 
do it.

Duncan Murdoch
>
> Did you perhaps have a function named FUN in your global environment? 
> If so you are being bitten by what I mentioned before.
>
> > FUN = function(...) 1
> > myfun <- function(x, FUN, ...){
> +      FUN(x, ...)
> + }
> > round <- 2
> > myfun(0.85, FUN = round, digits=1)
> [1] 1
>
> ~G
>
> On Thu, Oct 22, 2015 at 2:25 PM, Duncan Murdoch 
> <murdoch.duncan at gmail.com <mailto:murdoch.duncan at gmail.com>> wrote:
>
>     On 22/10/2015 1:59 PM, Joris Meys wrote:
>
>         Hi all,
>
>         When teaching this year's class, I was quite amazed that one
>         of my examples
>         didn't work any longer. I wanted to illustrate the importance of
>         match.fun() with following code:
>
>         myfun <- function(x, FUN, ...){
>              FUN(x, ...)
>         }
>         round <- 2
>         myfun(0.85, FUN = round, digits=1)
>
>         I expected to see an error, but this code doesn't generate
>         one. It seems as
>         if in the current R version match.fun() is added automatically.
>
>         I've scrolled through the complete R News section specifying
>         all the
>         changes and bug fixes, starting from 3.0.0.  I couldn't find
>         anything on
>         that change in behaviour though. Where can I find more
>         information on what
>         changed exactly?
>
>
>     When you say "current R version", what do you mean?  I see an error:
>
>     > myfun <- function(x, FUN, ...){
>     +     FUN(x, ...)
>     + }
>     > round <- 2
>     > myfun(0.85, FUN = round, digits=1)
>     Error in myfun(0.85, FUN = round, digits = 1) (from #2) :
>       could not find function "FUN"
>
>     I see this in 3.2.2, R-patched and R-devel.
>
>     Duncan Murdoch
>
>
>     ______________________________________________
>     R-devel at r-project.org <mailto:R-devel at r-project.org> mailing list
>     https://stat.ethz.ch/mailman/listinfo/r-devel
>
>
>
>
> -- 
> Gabriel Becker, PhD
> Associate Scientist (Bioinformatics)
> Genentech Research



[Rd] Changed behaviour when passing a function?
Duncan Murdoch