From simon.urbanek at r-project.org  Thu Aug 20 15:06:19 2009
From: simon.urbanek at r-project.org (Simon Urbanek)
Date: Thu, 20 Aug 2009 09:06:19 -0400
Subject: [Rd] Problem using findVar( ) in combination with R's lazy
	evaluation
In-Reply-To: <25061253.post@talk.nabble.com>
References: <25061253.post@talk.nabble.com>
Message-ID: <113A5FE0-722F-4CBE-9E50-74F2F83E2956@r-project.org>

Marcel,

On Aug 20, 2009, at 8:41 , MarcelK wrote:

> I have a few small questions about the usage of the C findVar( )  
> function when used in C code called with '.Call'. In my case I  
> create an R function with an argument. This function calls some C  
> code in which I use findVar( ) to retrieve the values from the  
> argument. Ofcourse normally I would just give the values as argument  
> to .Call, but in my project I need to use findVar for various  
> reasons (can elaborate if needed, but it's not really relevant..)  
> Below is a small example of an R function and the C code in which  
> the problem shows:  (skip to bold 'question' part if this is  
> allready known)
>
> ----------# R function #--------
>
> f <- function(x) {
>  .Call("envtest", environment())
> }
>
> ----------# C function #--------
>
> SEXP envtest(SEXP rho) {
>  SEXP data;
>  PROTECT(data = allocVector(REALSXP, 1));

Scrap that - you're allocating data and in the next line you're  
discarding it?!?

>  data = findVar(install("x"), rho);

Just add

if (TYPEOF(data) == PROMSXP)
   data = eval(data, rho);

Cheers,
Simon

>  UNPROTECT(1);
>  return(data);
> }
>
> ----------# END #-----------
>
> The result of this function is that it should print the contents of  
> whatever
> is passed to the function f(x). But when executing the function, the  
> result
> is:
>
>
>> f(10)
> <promise: 0x142db20>
>
> Ofcourse this is due to lazy-evaluation as I've also read in the  
> thread
> http://www.nabble.com/confusion-about-evaluation.-to18561135.html#a18563086
> here .
>
> To 'fix' it, I would need to do 'something' with 'x', so changing the
> function f() to:
>
> f <- function(x) {
>   x = x
>  .Call("envtest", environment())
> }
>
> works as can be shown with:
>
>> f(10)
> [1] 10
>
> ----------
>
> My question on this subject is, how can I work around this 'x = x'  
> or other
> similar statement (print(x) to prevent lazy-evaluation? To  
> summarize, I
> would like to use findVar to retrieve values from R objects which  
> are given
> as function arguments to the R-function and not to the C-function.
>
> Other than the above question, I'd also like to know if findVar( ) by
> default also checks parent environments (inherits argument?) when  
> the object
> can not be found in the given environment (if not, should I look into
> passing the environment Hash etc?).
>
> And, as a last question, how can I retrieve the value from the R- 
> constant
> 'pi' using findVar? If I try this I receive the error "REAL can only  
> be
> applied to 'numeric' not a 'promise'".
>
> Thank you for any solutions or insights in these subjects, if more  
> details
> are needed I'm happy to give them!
>
> Marcel Kempenaar
>
> ----------------
>
>> sessionInfo()
> R version 2.9.1 (2009-06-26)
> x86_64-pc-linux-gnu
>
> locale:
> LC_CTYPE 
> = 
> en_US 
> .UTF 
> -8 
> ;LC_NUMERIC 
> = 
> C 
> ;LC_TIME 
> = 
> nl_NL 
> .UTF 
> -8 
> ;LC_COLLATE 
> = 
> C 
> ;LC_MONETARY 
> = 
> C 
> ;LC_MESSAGES 
> = 
> en_US 
> .UTF 
> -8 
> ;LC_PAPER 
> = 
> nl_NL 
> .UTF 
> -8 
> ;LC_NAME 
> = 
> C 
> ;LC_ADDRESS 
> =C;LC_TELEPHONE=C;LC_MEASUREMENT=en_US.UTF-8;LC_IDENTIFICATION=C
>
> attached base packages:
> [1] stats     graphics  grDevices utils     datasets  methods   base
>
> -- 
> View this message in context: http://www.nabble.com/Problem-using-findVar%28-%29-in-combination-with-R%27s-lazy-evaluation-tp25061253p25061253.html
> Sent from the R devel mailing list archive at Nabble.com.
>
> ______________________________________________
> R-devel at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel
>
>



[Rd] Problem using findVar( ) in combination with R's lazy evaluation
Simon Urbanek