From: Whit Armstrong <armstrong.whit_at_gmail.com>

Date: Mon, 16 Apr 2012 20:48:32 -0400

*>>
*

>> 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?
*

*>>
*

https://stat.ethz.ch/mailman/listinfo/r-devel Received on Tue 17 Apr 2012 - 00:56:56 GMT

Date: Mon, 16 Apr 2012 20:48:32 -0400

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:

> On 12-04-16 5:53 PM, Whit Armstrong wrote:

>> Can someone offer some advice on how to properly evaluate a 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_at_r-project.org mailing list

https://stat.ethz.ch/mailman/listinfo/r-devel Received on Tue 17 Apr 2012 - 00:56:56 GMT

This quarter's messages: by month, or sorted: [ by date ] [ by thread ] [ by subject ] [ by author ]

*
Archive maintained by Robert King, hosted by
the discipline of
statistics at the
University of Newcastle,
Australia.
Archive generated by hypermail 2.2.0, at Tue 17 Apr 2012 - 08:10:45 GMT.
*

*
Mailing list information is available at https://stat.ethz.ch/mailman/listinfo/r-devel.
Please read the posting
guide before posting to the list.
*