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@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel



______________________________________________
R-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel

Reply via email to