From kevinushey at gmail.com  Thu May  1 23:08:57 2014
From: kevinushey at gmail.com (Kevin Ushey)
Date: Thu, 1 May 2014 14:08:57 -0700
Subject: [Rd] How to test if an object/argument is "parse tree" -
 without evaluating it?
In-Reply-To: <5362B47E.8010801@gmail.com>
References: <CAFDcVCRpqqPkhFhaNpqe3ye-jo-8sWOODShKHneonTSB7m5Uvg@mail.gmail.com>
	<5362B47E.8010801@gmail.com>
Message-ID: <CAJXgQP0Ze2sAMbNRtVKYBNSBQmN4cXZMPPPnUOnnyvtBRnSH+A@mail.gmail.com>

Henrik,

If I understand correctly, you want something along the lines of
(following your example):

    foo <- function(expr) {
      if (!is.language(expr)) substitute(expr)
      else expr
    }

    ## first example
    expr0 <- foo({ x <- 1 })
    expr1 <- foo(expr0)
    stopifnot(identical(expr1, expr0))

    ## second
    expr2 <- foo(foo(foo(foo(expr0))))
    stopifnot(identical(expr2, expr0))

Hadley's guide on NSE + language elements in R
(http://adv-r.had.co.nz/Computing-on-the-language.html,
http://adv-r.had.co.nz/Expressions.html) may be helpful here.

Cheers,
Kevin

On Thu, May 1, 2014 at 1:54 PM, Duncan Murdoch <murdoch.duncan at gmail.com> wrote:
> On 01/05/2014, 4:39 PM, Henrik Bengtsson wrote:
>>
>> This may have been asked before, but is there an elegant way to check
>> whether an variable/argument passed to a function is a "parse tree"
>> for an (unevaluated) expression or not, *without* evaluating it if
>> not?
>
>
> "Parse tree" isn't R terminology.  Could you give an example of one call
> that passes a parse tree, and one that doesn't?
>
> Duncan Murdoch
>
>
>>
>> Currently, I do various rather ad hoc eval()+substitute() tricks for
>> this that most likely only work under certain circumstances. Ideally,
>> I'm looking for a isParseTree() function such that I can call:
>>
>> expr0 <- foo({ x <- 1 })
>> expr1 <- foo(expr0)
>> stopifnot(identical(expr1, expr0))
>>
>> where foo() is:
>>
>> foo <- function(expr) {
>>    if (!isParseTree(expr))
>>      expr <- substitute(expr)
>>    expr
>> }
>>
>> I also want to be able to do:
>>
>> expr2 <- foo(foo(foo(foo(expr0))))
>> stopifnot(identical(expr2, expr0))
>>
>> and calling foo() from within other functions that may use the same
>> "tricks".  The alternative is of course to do:
>>
>> foo <- function(expr, substitute=TRUE) {
>>    if (substitute) expr <- substitute(expr)
>>    expr
>> }
>>
>> but it would be neat to do this without passing an extra argument.  If
>> this is not possible to implement in plain R, can this be done
>> internally inspecting SEXP:s and so on?  Even better would be if
>> substitute() could do this for me, e.g.
>>
>> expr <- substitute(expr, unlessAlreadyDone=TRUE)
>>
>> Any suggestions?
>>
>> Thanks,
>>
>> Henrik
>>
>> ______________________________________________
>> R-devel at r-project.org mailing list
>> https://stat.ethz.ch/mailman/listinfo/r-devel
>>
>
> ______________________________________________
> R-devel at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel



[Rd] How to test if an object/argument is "parse tree" - without evaluating it?
Kevin Ushey