Deepayan Sarkar
2006-Oct-22 19:56 UTC
[Rd] Getting hold of a package's environment from C code
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. One solution that might work is to make 'rho' a global variable and assign the correct value when the package is loaded. Is that a good idea? How should I PROTECT it? -Deepayan
Duncan Murdoch
2006-Oct-22 20:28 UTC
[Rd] Getting hold of a package's environment from C code
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. > > One solution that might work is to make 'rho' a global variable and > assign the correct value when the package is loaded. Is that a good > idea? How should I PROTECT it? I'd say to avoid globals if you can, and I think you can here. Duncan Murdoch