Skip to content

Inconsistency between eval and withVisible (with patch)

6 messages · Peter Dalgaard, Gabriel Becker, Simon Urbanek +1 more

#
R-team,

The $value element of the return value of *withVisible* does not agree with
the return value of *eval* when *withVisible* is passed a variable (symbol)
containing an expression object or anonymous code/expressions which
generates an expression object when evaluated (such as calls to *parse* or *
expression*).

I have attached a patch against the svn trunk which addresses this.

Example (under devel r63577):
$value
*expression(5+pi)*

$visible
[1] TRUE
*[1] 8.141593*



With the attached patch this is no longer the case:
$value
*[1] 8.141593*

$visible
[1] TRUE

The patch changes only the withVisible function in eval.c. I'm happy to
work with / at the direction of an R-core member to get the patch into an
different form/coding style/fix strategy/etc if its current form is not
acceptable.

Thanks,
~G
R Under development (unstable) (2013-08-14 r63577)
Platform: x86_64-unknown-linux-gnu (64-bit)

locale:
 [1] LC_CTYPE=en_US.UTF-8       LC_NUMERIC=C
 [3] LC_TIME=en_US.UTF-8        LC_COLLATE=en_US.UTF-8
 [5] LC_MONETARY=en_US.UTF-8    LC_MESSAGES=en_US.UTF-8
 [7] LC_PAPER=en_US.UTF-8       LC_NAME=C
 [9] LC_ADDRESS=C               LC_TELEPHONE=C
[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base
#
On Aug 15, 2013, at 01:46 , Gabriel Becker wrote:

            
I don't think that is a bug, it is by design. The comparison should be to what happens if you just type the expression at the prompt:
expression(5+pi)
...so the patch introduces a bug since you can no longer withVisible() something that returns a language object.

  
    
#
On Aug 15, 2013, at 3:06 AM, Gabriel Becker wrote:

            
I think the confusion comes from the misunderstanding of what gets evaluated when. The simplest way to explain is that withVisible() is equivalent to evalq(), but you're thinking of eval() which does two evaluations (the argument is evaluated and then the value of the argument is evaluated). Note that this is documented very explicitly:

"eval? evaluates its first argument in the current scope before passing it to the evaluator"

whereas withVisible only does the first part:

"The argument is evaluated in the caller's context."

Cheers,
Simon