From deepayan.sarkar at gmail.com  Sun Oct 22 23:24:51 2006
From: deepayan.sarkar at gmail.com (Deepayan Sarkar)
Date: Sun, 22 Oct 2006 14:24:51 -0700
Subject: [Rd] Getting hold of a package's environment from C code
In-Reply-To: <453BD456.4050702@stats.uwo.ca>
References: <eb555e660610221256g3952a408sc25f06afe8307cb5@mail.gmail.com>
	<453BD456.4050702@stats.uwo.ca>
Message-ID: <eb555e660610221424kac664fanba7b998b12faaf1e@mail.gmail.com>

On 10/22/06, Duncan Murdoch <murdoch at stats.uwo.ca> wrote:
> On 10/22/2006 3:56 PM, Deepayan Sarkar wrote:
> > Hi,
> >
> > I have a package where I'm calling an R function (say "foo") from C
> > code. "foo" is in the same package, but is not exported. I construct
> > the call using lang1(install("foo")), but to eval it I need the
> > package's environment.  Is there a way to do this? Passing the correct
> > environment through .Call() is not an option.
> >
> > Right now, I'm getting the environment first using something like
> >
> >   rho = PROTECT(eval(lang2(install("environment"), install("bar")),
> > R_GlobalEnv))
> >
> > where bar _is_ exported. However, this doesn't work if the package is
> > loaded but not attached, and is also risky because someone might
> > define another "bar" that is found first.
>
> In R code, you could use getNamespace("pkg") to get the namespace
> environment.  I haven't tried this, but I'd assume
>
> PROTECT(rho = eval(lang2(install("getNamespace"),
>                           ScalarString(mkChar("pkg"))));
>
> (or something like it) would be the C equivalent.

Thanks, that works perfectly.

-Deepayan




[Rd] Getting hold of a package's environment from C code
Deepayan Sarkar