From murdoch@dunc@n @ending from gm@il@com  Sun Aug 12 22:16:07 2018
From: murdoch@dunc@n @ending from gm@il@com (Duncan Murdoch)
Date: Sun, 12 Aug 2018 16:16:07 -0400
Subject: [Rd] substitute() on arguments in ellipsis ("dot dot dot")?
In-Reply-To: <CAFDcVCQppvvnXSgnO0CeG8Hpr7JWxFUMTnO7ORjK2JkUFKKWAw@mail.gmail.com>
References: <CAFDcVCQppvvnXSgnO0CeG8Hpr7JWxFUMTnO7ORjK2JkUFKKWAw@mail.gmail.com>
Message-ID: <601ad637-43cd-63e7-81b7-7b350bff5624@gmail.com>

On 12/08/2018 4:00 PM, Henrik Bengtsson wrote:
> Hi. For any number of *known* arguments, we can do:
> 
> one <- function(a) list(a = substitute(a))
> two <- function(a, b) list(a = substitute(a), b = substitute(b))
> 
> and so on. But how do I achieve the same when I have:
> 
> dots <- function(...) list(???)
> 
> I want to implement this such that I can do:
> 
>> exprs <- dots(1+2)
>> str(exprs)
> List of 1
>   $ : language 1 + 2
> 
> as well as:
> 
>> exprs <- dots(1+2, "a", rnorm(3))
>> str(exprs)
> List of 3
>   $ : language 1 + 2
>   $ : chr "a"
>   $ : language rnorm(3)
> 
> Is this possible to achieve using plain R code?

I think so.  substitute(list(...)) gives you a single expression 
containing a call to list() with the unevaluated arguments; you can 
convert that to what you want using something like

dots <- function (...) {
   exprs <- substitute(list(...))
   as.list(exprs[-1])
}

Duncan Murdoch



[Rd] substitute() on arguments in ellipsis ("dot dot dot")?
Duncan Murdoch