On 06 May 2016, at 02:43 , David Winsemius <dwinsem...@comcast.net> wrote:

> 
>> On May 5, 2016, at 5:12 PM, Spencer Graves 
>> <spencer.gra...@effectivedefense.org> wrote:
>> 
>> I want a function to evaluate one argument
>> in the environment of a data.frame supplied
>> as another argument.  "attach" works for
>> this, but "with" does not.  Is there a way
>> to make "with" work?  I'd rather not attach
>> the data.frame.
>> 
>> 
>> With the following two functions "eval.w.attach"
>> works but "eval.w.with" fails:
>> 
>> 
>> dat <- data.frame(a=1:2)
>> eval.w.attach <- function(x, dat){
>>  attach(dat)
>>  X <- x
>>  detach()
>>  X
>> }
>> 
>> eval.w.with <- function(x, dat){
>>  with(dat, x)
>> }
>> 
>> eval.w.attach(a/2, dat) # returns c(.5, 1)
> 
> How about using eval( substitute( ...))?
> 
> eval.w.sub <- function(expr, datt){
>   eval( substitute(expr), env=datt)
>                         }
> eval.w.sub(a/2, dat)
> #[1] 0.5 1.0
> 
> 

Actually, I think a better overall strategy is to say that if you want to pass 
an expression to a function, then pass an expression object (or a call object 
or maybe a formula object). 

Once you figure out _how_ your eval.w.attach works (sort of), you'll get the 
creeps: 

Lazy evaluation causes the argument x to be evaluated after the attach(), hence 
the evaluation environment of an actual argument is being temporarily modified 
from inside a function. 

Apart from upsetting computer science purists, there could be hidden problems: 
One major issue is that  values in "dat" could be masked by values in the 
global environment, another issue is that an error in evaluating the expression 
will leave dat attached. So at a minimum, you need to recode using on.exit() 
magic.

So my preferences go along these lines:

> dat <- data.frame(a=1:2)
> eval.expression <- function(e, dat) eval(e, dat)
> eval.expression(quote(a/2), dat)
[1] 0.5 1.0
> eval.expression(expression(a/2), dat)
[1] 0.5 1.0

> eval.formula <- function(f, dat) eval(f[[2]], dat)
> eval.formula(~a/2, dat)
[1] 0.5 1.0

Peter D.



> -- 
> David.
> 
> 
>> 
>> eval.w.with(a/2, dat) # Error ... 'a' not found
>> 
>> 
>> Thanks, Spencer Graves
>> 
>>      [[alternative HTML version deleted]]
>> 
>> ______________________________________________
>> R-help@r-project.org mailing list -- To UNSUBSCRIBE and more, see
>> https://stat.ethz.ch/mailman/listinfo/r-help
>> PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
>> and provide commented, minimal, self-contained, reproducible code.
> 
> David Winsemius
> Alameda, CA, USA
> 
> ______________________________________________
> R-help@r-project.org mailing list -- To UNSUBSCRIBE and more, see
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
> and provide commented, minimal, self-contained, reproducible code.

-- 
Peter Dalgaard, Professor,
Center for Statistics, Copenhagen Business School
Solbjerg Plads 3, 2000 Frederiksberg, Denmark
Phone: (+45)38153501
Office: A 4.23
Email: pd....@cbs.dk  Priv: pda...@gmail.com

______________________________________________
R-help@r-project.org mailing list -- To UNSUBSCRIBE and more, see
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.

Reply via email to