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