Skip to content

eval a SYMSXP from C

3 messages · Duncan Murdoch, Whit Armstrong

#
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)
[1] "symbol"
[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
#
On 12-04-16 5:53 PM, Whit Armstrong wrote:
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
#
Thanks, Duncan.

Your suggestion works.

And thanks for the hint, about the env.  I suppose I should preserve
the env of the original function where the substitute was called...

Cheers,
Whit


On Mon, Apr 16, 2012 at 8:01 PM, Duncan Murdoch
<murdoch.duncan at gmail.com> wrote: