From wdunlap at tibco.com  Wed Jul 15 21:51:39 2015
From: wdunlap at tibco.com (William Dunlap)
Date: Wed, 15 Jul 2015 12:51:39 -0700
Subject: [Rd] bquote/evalq behavior changed in R-3.2.1
In-Reply-To: <CADT-iTo3FEs7WXAbKDZcRsZCHOj1dun7ji0cEDSQX9ycR8rO3w@mail.gmail.com>
References: <CADT-iToV4pMjoeyNpXRPX_jJNdaD7oqAPr24o+-RfrMv2q+zHw@mail.gmail.com>
	<CAF8bMcbeggM5=SQLfVnmPMiuBa5ejmOjfhTQfb0kLr_QcKab4Q@mail.gmail.com>
	<CADT-iTo3FEs7WXAbKDZcRsZCHOj1dun7ji0cEDSQX9ycR8rO3w@mail.gmail.com>
Message-ID: <CAF8bMcbhRwH12rWsfVpK9E6gz86Fv0nkkkHJZ=DxfwwYzSRfwA@mail.gmail.com>

I think rapply() was changed to act like lapply() in this respect.

In R-3.1.3 we got
rapply(list(quote(1+myNumber)), evalq, envir=list2env(list(myNumber=17)))
#[1] 18
rapply(list(quote(1+myNumber)), eval, envir=list2env(list(myNumber=17)))
#Error in (function (expr, envir = parent.frame(), enclos = if
(is.list(envir) ||  :
  object 'myNumber' not found
lapply(list(quote(1+myNumber)), evalq, envir=list2env(list(myNumber=17)))
#Error in eval(substitute(expr), envir, enclos) : object 'X' not found
lapply(list(quote(1+myNumber)), eval, envir=list2env(list(myNumber=17)))
#[[1]]
#[1] 18
while in R-3.2.0 we get
rapply(list(quote(1+myNumber)), evalq, envir=list2env(list(myNumber=17)))
#Error in eval(substitute(expr), envir, enclos) : object 'X' not found
rapply(list(quote(1+myNumber)), eval, envir=list2env(list(myNumber=17)))
#[1] 18
lapply(list(quote(1+myNumber)), evalq, envir=list2env(list(myNumber=17)))
#Error in eval(substitute(expr), envir, enclos) : object 'X' not found
lapply(list(quote(1+myNumber)), eval, envir=list2env(list(myNumber=17)))
#[[1]]
#[1] 18

Make the FUN argument function(arg)sys.call() to see some details of the
change.


Bill Dunlap
TIBCO Software
wdunlap tibco.com

On Wed, Jul 15, 2015 at 12:35 PM, Dayne Filer <dayne.filer at gmail.com> wrote:

> In 3.1.2 eval does not store the result of the bquote-generated call in
> the given environment. Interestingly, in 3.2.1 eval does store the result
> of the bquote-generated call in the given environment.
>
> In other words if I run the given example with eval rather than evalq, on
> 3.1.2 "x" is never stored in "fenv," but it is when I run the same code on
> 3.2.1. However, the given example stores "x" in "fenv" on 3.1.2, but throws
> the error I gave when run on 3.2.1.
>
> To give credit, I received the idea for using evalq from SO:
> http://stackoverflow.com/a/22559385
>
> Dayne
>
>
> On Wed, Jul 15, 2015 at 3:29 PM, William Dunlap <wdunlap at tibco.com> wrote:
>
>> I am curious why you used evalq instead of eval in this code.
>>
>> Bill Dunlap
>> TIBCO Software
>> wdunlap tibco.com
>>
>> On Wed, Jul 15, 2015 at 11:49 AM, Dayne Filer <dayne.filer at gmail.com>
>> wrote:
>>
>>> Hello,
>>>
>>> I upgraded from 3.1.2 to 3.2.1 and am receiving errors on code that
>>> worked
>>> as I intended previously. Briefly, I am using bquote to generate
>>> expressions to modify data.table objects within a  function, so I need
>>> the
>>> changes to actually be stored in the given environment. Previously, I
>>> used
>>> code like the following:
>>>
>>> test <- list(bquote(x <- 10))
>>> fenv <- environment()
>>> rapply(test, evalq, envir = fenv)
>>>
>>> Although the code in the example above is much simpler, it shows the
>>> problem. On 3.1.2 the expression is evaluated and x is stored as 10 in
>>> the
>>> given environment, fenv. In 3.2.1 the code throws an error:
>>>
>>> Error in eval(substitute(expr), envir, enclos) : object 'X' not found
>>>
>>> I could not find anything in the release notes that would explain this
>>> change. Changing evalq to eval works in 3.2.1, but eval does not store x
>>> in
>>> the given environment in 3.1.2.
>>>
>>> Thanks,
>>>
>>> Dayne
>>>
>>>         [[alternative HTML version deleted]]
>>>
>>> ______________________________________________
>>> R-devel at r-project.org mailing list
>>> https://stat.ethz.ch/mailman/listinfo/r-devel
>>>
>>
>>
>

	[[alternative HTML version deleted]]



[Rd] bquote/evalq behavior changed in R-3.2.1
William Dunlap