From tomas.kalibera at gmail.com  Wed May 10 21:58:43 2017
From: tomas.kalibera at gmail.com (Tomas Kalibera)
Date: Wed, 10 May 2017 21:58:43 +0200
Subject: [Rd] R-3.3.3/R-3.4.0 change in sys.call(sys.parent())
In-Reply-To: <CAF8bMcZm2EvJLTUH6x51Fxi+HQyHD0zBMKTfTOsvQfnVtDKBGw@mail.gmail.com>
References: <CAF8bMcZm2EvJLTUH6x51Fxi+HQyHD0zBMKTfTOsvQfnVtDKBGw@mail.gmail.com>
Message-ID: <d79e0914-bcff-55ff-b8cf-ad1ee7cf4d48@gmail.com>


The difference in the outputs between 3.3 and 3.4 is in how call 
expressions are selected in presence of .Internals. R is asked for a 
call expression for "eval". In 3.3 one gets the arguments for the call 
expression from the .Internal that implements eval. In 3.4 one gets the 
arguments for the call expression from the closure wrapper of "eval", 
which is less surprising. See e.g.

(3.4)
 > evalq()
Error in evalq() : argument is missing, with no default

vs

(3.3)
 > evalq()
Error in eval(substitute(expr), envir, enclos) :
   argument is missing, with no default

(and yes, these examples work with sys.call() and lattice originally 
used it in xyplot - perhaps it'd be best to submit a bug report/issue 
for lattice)

Tomas


On 05/09/2017 11:06 PM, William Dunlap via R-devel wrote:
> Some formula methods for S3 generic functions use the idiom
>      returnValue$call <- sys.call(sys.parent())
> to show how to recreate the returned object or to use as a label on a
> plot.  It is often followed by
>       returnValue$call[[1]] <- quote(myName)
> E.g., I see it in packages "latticeExtra" and "leaps", and I suspect it
> used in "lattice" as well.
>
> This idiom has not done good things for quite a while (ever?) but I noticed
> while running tests that it acts differently in R-3.4.0 than in R-3.3.3.
> Neither the old or new behavior is nice.  E.g., in R-3.3.3 we get
>
>> parseEval <- function(text, envir) eval(parse(text=text), envir=envir)
>> parseEval('lattice::xyplot(mpg~hp, data=datasets::mtcars)$call',
> envir=new.env())
> xyplot(expr, envir, enclos)
>
> and
>
>> evalInEnvir <- function(call, envir) eval(call, envir=envir)
>> evalInEnvir(quote(lattice::xyplot(mpg~hp, data=datasets::mtcars)$call),
> envir=new.env())
> xyplot(expr, envir, enclos)
>
> while in R-3.4.0 we get
>> parseEval <- function(text, envir) eval(parse(text=text), envir=envir)
>> parseEval('lattice::xyplot(mpg~hp, data=datasets::mtcars)$call',
> envir=new.env())
> xyplot(parse(text = text), envir = envir)
>
> and
>
>> evalInEnvir <- function(call, envir) eval(call, envir=envir)
>> evalInEnvir(quote(lattice::xyplot(mpg~hp, data=datasets::mtcars)$call),
> envir=new.env())
> xyplot(call, envir = envir)
>
> Should these packages be be fixed up to use just sys.call()?
>
> Bill Dunlap
> TIBCO Software
> wdunlap tibco.com
>
> 	[[alternative HTML version deleted]]
>
> ______________________________________________
> R-devel at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel



[Rd] R-3.3.3/R-3.4.0 change in sys.call(sys.parent())
Tomas Kalibera