[Rd] Getting hold of a package's environment from C code
Prof Brian Ripley
ripley at stats.ox.ac.uk
Mon Oct 23 08:41:00 CEST 2006
On Sun, 22 Oct 2006, Deepayan Sarkar wrote:
> 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.
mkString("pkg") is simpler than ScalarString(mkChar("pkg")).
--
Brian D. Ripley, ripley at stats.ox.ac.uk
Professor of Applied Statistics, http://www.stats.ox.ac.uk/~ripley/
University of Oxford, Tel: +44 1865 272861 (self)
1 South Parks Road, +44 1865 272866 (PA)
Oxford OX1 3TG, UK Fax: +44 1865 272595
More information about the R-devel
mailing list