Re: [Rd] WISH: eval() to preserve the visibility (now value is always visible)

2015-02-10 Thread Henrik Bengtsson
On Sun, Feb 8, 2015 at 8:44 PM, Suharto Anggono Suharto Anggono via
R-devel r-devel@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 mistakeThis 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@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


Re: [Rd] WISH: eval() to preserve the visibility (now value is always visible)

2015-02-08 Thread Suharto Anggono Suharto Anggono via R-devel
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

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


Re: [Rd] WISH: eval() to preserve the visibility (now value is always visible)

2015-02-07 Thread Duncan Murdoch
On 07/02/2015 12:40 PM, Henrik Bengtsson wrote:
 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

What's wrong with the workaround?

Duncan Murdoch

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