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

Duncan Murdoch murdoch.duncan at gmail.com
Thu May 1 22:54:22 CEST 2014


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
>



More information about the R-devel mailing list