[R] understanding as.list(substitute(...()))

Dénes Tóth toth@dene@ @end|ng |rom kogentum@hu
Tue Oct 6 09:22:40 CEST 2020


Hi Tim,

I have also asked a similar question a couple of months ago, and someone 
else did the same recently, maybe on r-devel.

We received no "official" response, but Deepayan Sarkar (R Core Team 
member) claimed that:

"
There is no documented reason for this to work (AFAIK), so again, I
would guess this is a side-effect of the implementation, and not a API
feature you should rely on. This is somewhat borne out by the
following:

 > foo <- function(...) substitute({...()})
 > foo(abc$de, fg[h], i)
{
    pairlist(abc$de, fg[h], i)
}
 > foo(abc$de, fg[h], , i) # add a missing argument for extra fun
{
    as.pairlist(alist(abc$de, fg[h], , i))
}

which is not something you would expect to see at the user level. So
my recommendation: don't use ...() and pretend that you never
discovered it in the first place. Use match.call() instead, as
suggested by Serguei.

[Disclaimer: I have no idea what is actually going on, so these are
just guesses. There are some hints at
https://cran.r-project.org/doc/manuals/r-devel/R-ints.html#Dot_002ddot_002ddot-arguments
if you want to folllow up.]
"

Cheers,
Denes




On 10/6/20 8:38 AM, Tim Taylor wrote:
> I probably need to be more specific.  What confuses me is not the use
> of substitute, but the parenthesis after the dots.  It clearly works
> and I can make guesses as to why but it is definitely not obvious.
> The following function gives the same final result but I can
> understand what is happening.
> 
> dots <- function (...) {
>     exprs <- substitute(list(...))
>     as.list(exprs[-1])
> }
> 
> In the original,     dots <- function(...) as.list(substitute(...())),
>     Does ...() get parsed in a special way?
> 
> Tim
> 
> On Tue, 6 Oct 2020 at 05:30, Bert Gunter <bgunter.4567 using gmail.com> wrote:
>>
>> You need to understand what substitute() does -- see ?substitute and/or a tutorial on "R computing on the language" or similar.
>>
>> Here is a simple example that may clarify:
>>
>>> dots <- function(...) as.list(substitute(...()))
>>> dots(log(foo))
>> [[1]]
>> log(foo)  ## a call, a language object
>>
>>> dots2 <- function(...) as.list(...)
>>> dots2(log(foo))
>> Error in as.list(...) : object 'foo' not found
>> ## substitute() does not evaluate its argument; as.list() does
>>
>> Cheers,
>> Bert Gunter
>>
>> "The trouble with having an open mind is that people keep coming along and sticking things into it."
>> -- Opus (aka Berkeley Breathed in his "Bloom County" comic strip )
>>
>>
>> On Mon, Oct 5, 2020 at 1:37 PM Tim Taylor <tim.taylor using hiddenelephants.co.uk> wrote:
>>>
>>> Could someone explain what is happening with the ...() of the
>>> following function:
>>>
>>> dots <- function(...) as.list(substitute(...()))
>>>
>>> I understand what I'm getting as a result but not why.   ?dots and
>>> ?substitute leave me none the wiser.
>>>
>>> regards
>>> Tim
>>>
>>> ______________________________________________
>>> R-help using r-project.org mailing list -- To UNSUBSCRIBE and more, see
>>> 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 using r-project.org mailing list -- To UNSUBSCRIBE and more, see
> 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.
>



More information about the R-help mailing list