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

Tim Taylor t|m@t@y|or @end|ng |rom h|ddene|eph@nt@@co@uk
Tue Oct 6 09:44:47 CEST 2020


Cheers Denes,

That's useful to know.  I'll stick with the match.call version
instead.  Interestingly I initially tried to post to R-devel (as I
thought it may involve something internal) but was asked to post here
instead.

Best

Tim


On Tue, 6 Oct 2020 at 08:22, Dénes Tóth <toth.denes using kogentum.hu> wrote:
>
> 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