From armstrong.whit at gmail.com  Mon Apr 16 23:53:02 2012
From: armstrong.whit at gmail.com (Whit Armstrong)
Date: Mon, 16 Apr 2012 17:53:02 -0400
Subject: [Rd] eval a SYMSXP from C
Message-ID: <CAMi=pg6-q5EOU1YHXiSqyjCvQ5vGtNNU2P8xjpr9sDB21nvzJw@mail.gmail.com>

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?

Thanks,
Whit



[Rd] eval a SYMSXP from C
Whit Armstrong