On 12-04-16 5:53 PM, Whit Armstrong wrote:
Can someone offer some advice on how to properly evaluate a SYMSXP
from a .Call ?

I have the following in R:

variable xn, with an attribute "mu" which references the variable mu
in the global environment.

I know "references" is a loose term; mu was defined in this fashion as
a way to implement deferred binding:

foo<- function(x,mu) {
     attr(x,"mu")<- substitute(mu)
     x
}

mu<- 2.0
xn<- foo(rnorm(100),mu)

typeof(attr(xn,"mu"))
[1] "symbol"
eval(attr(xn,"mu"))
[1] 2


In a .Call, I am attempting to eval the SYMSXP as follows:

SEXP mu_ = Rf_getAttrib(x_,Rf_install("mu"));

if(TYPEOF(mu_)==SYMSXP) {
   mu_ = Rf_eval(Rf_lang1(mu_),R_GlobalEnv);
}

However, when running this code, I get the following error:
Error in logp(xn) : could not find function "mu"

Do I need to create an expression of c("get", "mu") to force the name
lookup to evaluate the SYMSXP?


Rf_lang1(mu_) will produce mu(), not mu. I think you just want to evaluate mu_.

There are lots of possible types of object returned by substitute(mu), but you should be able to evaluate all of them. You probably don't want to evaluate them in R_GlobalEnv, you want to evaluate them in the environment where the call was made to foo, so that you'll get local variables if it was called from a function.

Duncan Murdoch

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

Reply via email to