From simon.urbanek at r-project.org  Thu Aug 15 14:59:35 2013
From: simon.urbanek at r-project.org (Simon Urbanek)
Date: Thu, 15 Aug 2013 08:59:35 -0400
Subject: [Rd] Inconsistency between eval and withVisible (with patch)
In-Reply-To: <CADwqtCO2drN5wN7MurSXs2j75+3gm0Q1y4yK6MaWkuHHtc3nzg@mail.gmail.com>
References: <CADwqtCNGqOmfYeOd4bEob7+zu4D=xwiyoAkU9P1KhHnF7FYMJw@mail.gmail.com>
	<780A6D7E-AFA3-4C07-AF61-C2ED06580526@gmail.com>
	<CAJoaRhaBLU4jXufDDFNfrtXB2pfrqqns9CgUQbfB=gvuW_iGxA@mail.gmail.com>
	<CADwqtCO2drN5wN7MurSXs2j75+3gm0Q1y4yK6MaWkuHHtc3nzg@mail.gmail.com>
Message-ID: <9D1C0CBD-245C-417E-B7D6-9623609C3E99@r-project.org>


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

> On Wed, Aug 14, 2013 at 11:14 PM, Peter Meilstrup <peter.meilstrup at gmail.com
>> wrote:
> 
>> I agree that the present behavior of withVisible is the Right Thing, but
>> the documentation is confusing. The documentation claims that withVisible
>> "evaluates an expression."
>> 
>> This may capture an inside view of how the .Internal function is
>> implemented, but is nonsense from the R user's standpoint, where
>> "expression" is a particular type of R object and "evaluate an expression"
>> means to do something like eval().
>> 
> 
> And particularly, if you pass withVisible a variable containing an
> expression, said expression is not evaluated. The expression/symbol
> pointing to the object where it is stored is, I know, but the expression
> itself is not.
> 
> Furthermore, the exact same language ("evaluate an expression") appears in
> the eval documentation, and that function DOES evaluate the actual
> expression. Thus my (apparently incorrect) assumption that they should have
> the same behavior.
> 

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



> ~G
> 
> 
>> 
>> Peter
>> 
>> 
>> On Wed, Aug 14, 2013 at 11:04 PM, peter dalgaard <pdalgd at gmail.com> wrote:
>> 
>>> 
>>> On Aug 15, 2013, at 01:46 , Gabriel Becker wrote:
>>> 
>>>> 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):
>>>> 
>>>>> withVisible(parse(text="5+pi"))
>>>> $value
>>>> *expression(5+pi)*
>>>> 
>>>> $visible
>>>> [1] TRUE
>>>> 
>>>>> eval(parse(text="5+pi"))
>>>> *[1] 8.141593*
>>>> 
>>> 
>>> 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:
>>> 
>>>> parse(text="5+pi")
>>> expression(5+pi)
>>> 
>>> 
>>>> With the attached patch this is no longer the case:
>>> 
>>> ...so the patch introduces a bug since you can no longer withVisible()
>>> something that returns a language object.
>>> 
>>>> 
>>>>> withVisible(parse(text="5+pi"))
>>>> $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
>>>> 
>>>>> sessionInfo()
>>>> 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
>>>> 
>>>> 
>>>> 
>>>> --
>>>> Gabriel Becker
>>>> Graduate Student
>>>> Statistics Department
>>>> University of California, Davis
>>>> ______________________________________________
>>>> R-devel at r-project.org mailing list
>>>> https://stat.ethz.ch/mailman/listinfo/r-devel
>>> 
>>> --
>>> Peter Dalgaard, Professor,
>>> Center for Statistics, Copenhagen Business School
>>> Solbjerg Plads 3, 2000 Frederiksberg, Denmark
>>> Phone: (+45)38153501
>>> Email: pd.mes at cbs.dk  Priv: PDalgd at gmail.com
>>> 
>>> ______________________________________________
>>> R-devel at r-project.org mailing list
>>> https://stat.ethz.ch/mailman/listinfo/r-devel
>>> 
>> 
>> 
> 
> 
> -- 
> Gabriel Becker
> Graduate Student
> Statistics Department
> University of California, Davis
> 
> 	[[alternative HTML version deleted]]
> 
> ______________________________________________
> R-devel at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel
> 
> 



[Rd] Inconsistency between eval and withVisible (with patch)
Simon Urbanek