Suharto Anggono Suharto Anggono
2015-Feb-09 04:44 UTC
[Rd] WISH: eval() to preserve the "visibility" (now value is always visible)
Sorry to intervene. Argument passed to 'eval' is evaluated first. So, eval(x <- 2) is effectively like { x <- 2; eval(2) } , which is effectively { x <- 2; 2 } . The result is visible. eval(expression(x <- 2)) or eval(quote(x <- 2)) or evalq(x <- 2) gives the same effect as x <- 2 . The result is invisible. In function 'eval2', res <- eval(withVisible(expr), envir=envir, ...) is effectively res <- withVisible(expr) . ------------------- Would it be possible to have the value of eval() preserve the "visibility" of the value of the expression? "PROBLEM": # Invisible> x <- 1# Visible> eval(x <- 2)[1] 2 "TROUBLESHOOTING":> withVisible(x <- 1)$value [1] 1 $visible [1] FALSE> withVisible(eval(x <- 2))$value [1] 2 $visible [1] TRUE WORKAROUND: eval2 <- function(expr, envir=parent.frame(), ...) { res <- eval(withVisible(expr), envir=envir, ...) value <- res$value if (res$visible) value else invisible(value) }> x <- 1 > eval(x <- 2)[1] 2> eval2(x <- 3) > x[1] 3 /Henrik
Henrik Bengtsson
2015-Feb-11 00:44 UTC
[Rd] WISH: eval() to preserve the "visibility" (now value is always visible)
On Sun, Feb 8, 2015 at 8:44 PM, Suharto Anggono Suharto Anggono via R-devel <r-devel at r-project.org> wrote:> Sorry to intervene.No, I'm very happy you intervened. You're comment is 100% valid/correct making my wish moot. Your explanation is very clear and nails it; one should use eval(substitute(expr)) or evalq(expr) for what I'm trying to do. It all came from me trying to prevent> withOptions({x <- 1}, foo=1)from printed the value, where (somewhat simplified): withOptions <- function(expr, ..., envir=parent.frame()) { oopts <- options(...) on.exit(options(oopts)) eval(expr, envir=envir) } I have a few of these withNnn() functions, but for this particular one (*) I had forgotten an expr <- substitute(expr) in there, which caused me to incorrectly blame eval(). <recursive mistake>This is very much the same problem as you observed with my eval2() example.</recursive mistake> Thank you very much Henrik (*) Actually withSeeds() which is to messy to use as an example.> > Argument passed to 'eval' is evaluated first. > So, > eval(x <- 2) > is effectively like > { x <- 2; eval(2) } , > which is effectively > { x <- 2; 2 } . > The result is visible. > > eval(expression(x <- 2)) > or > eval(quote(x <- 2)) > or > evalq(x <- 2) > gives the same effect as > x <- 2 . > The result is invisible. > > In function 'eval2', > res <- eval(withVisible(expr), envir=envir, ...) > is effectively > res <- withVisible(expr) . > > ------------------- > > Would it be possible to have the value of eval() preserve the > "visibility" of the value of the expression? > > > "PROBLEM": > > # Invisible >> x <- 1 > > # Visible >> eval(x <- 2) > [1] 2 > > "TROUBLESHOOTING": >> withVisible(x <- 1) > $value > [1] 1 > $visible > [1] FALSE > >> withVisible(eval(x <- 2)) > $value > [1] 2 > $visible > [1] TRUE > > > WORKAROUND: > eval2 <- function(expr, envir=parent.frame(), ...) { > res <- eval(withVisible(expr), envir=envir, ...) > value <- res$value > if (res$visible) value else invisible(value) > } > >> x <- 1 >> eval(x <- 2) > [1] 2 >> eval2(x <- 3) >> x > [1] 3 > > /Henrik > > ______________________________________________ > R-devel at r-project.org mailing list > https://stat.ethz.ch/mailman/listinfo/r-devel
Reasonably Related Threads
- WISH: eval() to preserve the "visibility" (now value is always visible)
- Inconsistency between eval and withVisible (with patch)
- WISH: Sys.setlocale() to return value invisibly
- PATCH: Avoiding extra copies (NAMED bumped) with source(..., print.eval=FALSE) ...and with print.eval=TRUE?
- Missing objects using dump.frames for post-mortem debugging of crashed batch jobs. Bug or gap in documentation?