Re: [Rd] foo2Args()

From: Gabor Grothendieck <ggrothendieck_at_gmail.com>
Date: Fri 30 Jun 2006 - 23:14:45 GMT

On 6/30/06, Paul Gilbert <pgilbert@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.



R-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel Received on Sat Jul 01 09:22:15 2006

Archive maintained by Robert King, hosted by the discipline of statistics at the University of Newcastle, Australia.
Archive generated by hypermail 2.1.8, at Sat 01 Jul 2006 - 02:23:51 GMT.

Mailing list information is available at https://stat.ethz.ch/mailman/listinfo/r-help. Please read the posting guide before posting to the list.