From ggrothendieck at gmail.com  Sat Jul  1 01:14:45 2006
From: ggrothendieck at gmail.com (Gabor Grothendieck)
Date: Fri, 30 Jun 2006 19:14:45 -0400
Subject: [Rd] foo2Args()
In-Reply-To: <44A593A9.9010802@bank-banque-canada.ca>
References: <44A58747.7080705@bank-banque-canada.ca>
	<44A58CE6.2040903@stats.uwo.ca>
	<44A593A9.9010802@bank-banque-canada.ca>
Message-ID: <971536df0606301614g1dc5f4b5rd8aa55227a3ef305@mail.gmail.com>

On 6/30/06, Paul Gilbert <pgilbert at bank-banque-canada.ca> wrote:
>
>
> Duncan Murdoch wrote:
>
> > On 6/30/2006 4:19 PM, Paul Gilbert wrote:
> >
> >> I was just considering trying to clean up the arguments to a function
> >> that calls other functions,
> >> and was playin with a suggestion Achim made during a conversation at
> >> useR.  The idea is, instead of using list(), use a small function to
> >> construct and check arguments. My hope was to be able to do this
> >> without making it globally visible:
> >>
> >> foo <- function(x, args=foo2Args()) {
> >>   foo2Args <- function(a=1, b=2){list(a,b)}
> >>   # above would actual do more testing of args
> >>   #now I would call foo2 with args, but to test just
> >>   args
> >>   }
> >>
> >> Now,
> >>
> >>  > foo(1)   # should I be surprized that this works
> >> [[1]]
> >> [1] 1
> >>
> >> [[2]]
> >> [1] 2
> >
> >
> > I don't think it really works, it's just a coincidence that the answer
> > matches your expectations:
> >
> > > foo(3)
> > [[1]]
> > [1] 1
> >
> > [[2]]
> > [1] 2
> >
> > Or maybe I am completely misunderstanding your expectations...
> >
> >>
> >>  > foo(1, args=foo2Args(a=2, b=10)) # or that this does not
> >> Error in foo(1, args = foo2Args(a = 2, b = 10)) :
> >>     could not find function "foo2Args"
> >
> >
> > This is a somewhat subtle thing about the way args are evaluated.
> > What is done makes lots of sense once you understand it:
> >
> >  - When you specify an argument in the call, the expression you give
> > is evaluated in the current context.  In the context where you made
> > this call, foo2Args is not defined, hence the error.
> >
> >  - When you specify a default for an argument, it is evaluated in the
> > local context of the function evaluation.  So as a default, foo2Args
> > is recognized, because it's a local variable within foo.
> >
> > You also need to remember "lazy evaluation":  neither of the above
> > actually take place until args is used.
> >
> > R is pretty flexible, so it's probably possible to do whatever you
> > intended here; can you describe exactly what you want to happen?
>
> I guess what I want to happen is that when args is used it it gets
> evaluated in the local context of the function, whether or not I am
> specifying the argument or using the default. Is there a way to do that?
>
> What I expected to happen was that it would always get evaluated either
> in the local context or in the calling context, i.e., it would fail or
> not fail, but that would not depend on whether I am specifying the
> argument or using the default, so your first points explain this.
>

I think its better that a function check its own arguments.  Having the
caller check the arguments by calling foo2Args seems to distribute
the functionality between the function and the caller so I don't think that
that is desirable.



[Rd] foo2Args()
Gabor Grothendieck