[R] turning R expressions into functions?

Bert Gunter gunter.berton at gene.com
Tue Jul 24 16:03:50 CEST 2012


OK Bill, et, al:

I prefer your 3rd form buried in dotsArgs as:

dotsArgs <- function()as.list(substitute((...),env=parent.frame()))[-1]

##testit
> f <- function(x, ..., atEnd) dotsArgs()
>  str(f(1, stop("don't evaluate me!"), Log=log(-10:1), atEnd=Inf))
List of 2
 $    : language stop("don't evaluate me!")
 $ Log: language log(-10:1)

Let me know if you see any problems (if you care to bother with it)

-- Bert

On Mon, Jul 23, 2012 at 3:04 PM, William Dunlap <wdunlap at tibco.com> wrote:
> I tend not to use match.call for this because it feels like I'm repeating
> work (argument matching) that has already been done.  Also, match.call's
> output needs to be processed a bit to get the expressions.
>
> The following 2 functions give the same results, a "pairlist" of the unevaluated
> arguments matching the "..." in the function definition.
>    f1 <- function(x, ..., atEnd) substitute(...())
>    f2 <- function(x, ..., atEnd) match.call(expand.dots=FALSE)$...
> E.g.,
>   > str(f1(1, stop("don't evaluate me!"), Log=log(-10:1), atEnd=Inf))
>   Dotted pair list of 2
>    $    : language stop("don't evaluate me!")
>    $ Log: language log(-10:1)
>   > str(f2(1, stop("don't evaluate me!"), Log=log(-10:1), atEnd=Inf))
>   Dotted pair list of 2
>    $    : language stop("don't evaluate me!")
>    $ Log: language log(-10:1)
> The former appears to be about 3 times as fast as the latter, but you need
> to run it a lot of times (>10^4) to see the difference.  There may be a bigger
> speedup if there are lots of non-"..." arguments, but I haven't tested that.
>
> I also use the following, which works in both S+ and R:
>    > f3 <- function(x, ..., atEnd) as.list(substitute(junk(...)))[-1]
>    > str(f3(1, stop("don't evaluate me!"), Log=log(-10:1), atEnd=Inf))
>    List of 2
>     $    : language stop("don't evaluate me!")
>     $ Log: language log(-10:1)
>
> It is probably best to bury this in a utility function with an intuitive name instead
> of trying to remember the idioms.  Perhaps there already is one.
>
> Bill Dunlap
> Spotfire, TIBCO Software
> wdunlap tibco.com
>
>
>> -----Original Message-----
>> From: Bert Gunter [mailto:gunter.berton at gene.com]
>> Sent: Monday, July 23, 2012 2:45 PM
>> To: William Dunlap
>> Cc: S Ellison; Jochen Voß; r-help at r-project.org
>> Subject: Re: [R] turning R expressions into functions?
>>
>> Bill:
>>
>> Is there some reason to prefer your "odd idiom" to match.call, perhaps
>> as as.list(match.call()), as proposed by Hadley?
>>
>> -- Bert
>>
>> On Mon, Jul 23, 2012 at 2:25 PM, William Dunlap <wdunlap at tibco.com> wrote:
>> > list(...) evaluates the things in ...
>> > E.g.,
>> >    > f0 <- function(x, ...) list(...)
>> >    > f0(1, warning("Hmm"), stop("Oops"), cat("some output\n"))[[2]]
>> >    Error in f0(1, warning("Hmm"), stop("Oops"), cat("some output\n")) : Oops
>> >    In addition: Warning message:
>> >    In f0(1, warning("Hmm"), stop("Oops"), cat("some output\n")) : Hmm
>> >
>> > You can use the odd idiom substitute(...()) to get the unevaluated ... arguments:
>> >    > f1 <- function(x, ...) substitute(...())
>> >    > f1(1, warning("Hmm"), stop("Oops"), cat("some output\n"))
>> >    [[1]]
>> >    warning("Hmm")
>> >
>> >    [[2]]
>> >    stop("Oops")
>> >
>> >    [[3]]
>> >    cat("some output\n")
>> >
>> >
>> > Bill Dunlap
>> > Spotfire, TIBCO Software
>> > wdunlap tibco.com
>> >
>> >
>> >> -----Original Message-----
>> >> From: r-help-bounces at r-project.org [mailto:r-help-bounces at r-project.org] On
>> >> Behalf Of S Ellison
>> >> Sent: Monday, July 23, 2012 2:12 PM
>> >> To: Jochen Voß
>> >> Cc: r-help at r-project.org
>> >> Subject: Re: [R] turning R expressions into functions?
>> >>
>> >> >> One of the things I would love to add to my package would be the
>> >> >> ability to compare more than two expressions in one call.  But
>> >> >> unfortunately, I haven't found out so far whether (and if so, how) it
>> >> >> is possible to extract the elements of a "..." object without
>> >> >> evaluating them.
>> >> >
>> >> >Have a look at match.call.
>> >>
>> >> ... or use
>> >> dotlist <- list(...)
>> >>
>> >> to get a list of everything included in ...
>> >>
>> >> S Ellison
>> >>
>> >>
>> *****************************************************************
>> >> **
>> >> This email and any attachments are confidential. Any use...{{dropped:8}}
>> >>
>> >> ______________________________________________
>> >> R-help at r-project.org mailing list
>> >> 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.
>> >
>> > ______________________________________________
>> > R-help at r-project.org mailing list
>> > 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.
>>
>>
>>
>> --
>>
>> Bert Gunter
>> Genentech Nonclinical Biostatistics
>>
>> Internal Contact Info:
>> Phone: 467-7374
>> Website:
>> http://pharmadevelopment.roche.com/index/pdb/pdb-functional-groups/pdb-
>> biostatistics/pdb-ncb-home.htm



-- 

Bert Gunter
Genentech Nonclinical Biostatistics

Internal Contact Info:
Phone: 467-7374
Website:
http://pharmadevelopment.roche.com/index/pdb/pdb-functional-groups/pdb-biostatistics/pdb-ncb-home.htm



More information about the R-help mailing list