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