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@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel


______________________________________________
R-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel

Reply via email to