[R-pkg-devel] Call internal R functions in C
Duncan Murdoch
murdoch@dunc@n @end|ng |rom gm@||@com
Wed Apr 28 12:05:10 CEST 2021
On 27/04/2021 12:34 p.m., Cai Li wrote:
> /Dear Duncan, Thank you very much for your helpful advice! In addition,
> could you kindly help answer my follow-up questions below? /
Sorry, I showed you how I did it. There are certainly other ways, but
you'll have to dig around in the manuals to find them.
Duncan Murdoch
> /
> /
> /Instead of passing the private R package environment to C, is there a
> way to alter the namespace so that files in the "R" directory of the
> package can be read by the C code but not exported to users? There are
> specialized export and import functions in the "roxygen2" package that
> can be used to alter the namespace, and I'm wondering whether altering
> the namespace would work as well
> (https://cran.r-project.org/web/packages/roxygen2/vignettes/namespace.html
> <https://nam12.safelinks.protection.outlook.com/?url=https%3A%2F%2Fcran.r-project.org%2Fweb%2Fpackages%2Froxygen2%2Fvignettes%2Fnamespace.html&data=04%7C01%7Ccai.li%40yale.edu%7Cfef92ea6326d4803577808d909969553%7Cdd8cbebb21394df8b4114e3e87abeb5c%7C0%7C0%7C637551364617695111%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C1000&sdata=PKtQPhcpncRWSzSY5FrYR2Pcbn6LaYDDX0GhEgVtLtA%3D&reserved=0>)./
> /
> /
> /However, if passing the private R package environment to C is the
> only/best way for the R functions to be read by C without getting
> exported, could you kindly offer additional advice for how to do this? I
> can pass an "environment" object from R to C within an SEXP object in C.
> However, I'm not sure how to pass the "environment" object between C
> functions. For instance, in the following function, could I declare a
> "char" object and save the "environment" object as a "char" within the C
> code?/
> /
> /
> /void
> maketree_diff(int n,
> int nc,
> double *y,
> double **data,
> int *types,
> int *ncat,
> int *treat,
> struct node *tree,
> int nmin2,
> int maxdepth,
> int method)/
>
> On Mon, Apr 26, 2021 at 5:30 AM Duncan Murdoch <murdoch.duncan using gmail.com
> <mailto:murdoch.duncan using gmail.com>> wrote:
>
> On 25/04/2021 10:30 p.m., Cai Li wrote:
> > Thanks Duncan! I was advised not to export those functions in the
> > namespace and keep them as internals. In terms of this, could you
> advise
> > what specific changes should I make to the C code so that I can
> evaluate
> > them in a suitable environment? I tried something like
> > "PROTECT(func_R=lang2(install("Package:::R_function"),
> func_data))," but
> > it did not work. Sorry this may be too naive and thanks again.
>
> That line creates the expression to evaluate, it doesn't evaluate it.
> You need to call eval() (the C function) on the result. Here's some
> code from rgl that does something similar:
>
> R code to initialize:
>
> rgl.init <- function(initValue = 0, onlyNULL = FALSE, debug =
> getOption("rgl.debug", FALSE))
> .Call( rgl_init,
> initValue, onlyNULL, environment(rgl.init), debug )
>
> The important thing here is "environment(rgl.init)", which is the
> private environment within the package.
>
> Then in C code, save that environment:
>
> rglNamespace = in_namespace;
>
> and use it later:
>
> result = eval(PROTECT(lang2(PROTECT(install("rglFonts")),
>
> PROTECT(ScalarString(mkChar(family))))), rglNamespace);
>
> Duncan Murdoch
>
> >
> > Cai
> >
> > On Sun, Apr 25, 2021 at 8:46 PM Duncan Murdoch
> <murdoch.duncan using gmail.com <mailto:murdoch.duncan using gmail.com>
> > <mailto:murdoch.duncan using gmail.com
> <mailto:murdoch.duncan using gmail.com>>> wrote:
> >
> > On 25/04/2021 7:23 p.m., Cai Li wrote:
> > > Hello All,
> > >
> > > I'm developing a package with C code. My question may be
> naive: I
> > have
> > > several internal R functions that need to be called by C,
> but I
> > cannot get
> > > it to work or find a solution. It can work if I export
> those internal
> > > functions in namespace, but it fails if I just want to
> keep them as
> > > internal functions without exporting them. I guess I need some
> > flags to
> > > indicate the "internal" R internal functions? Could you please
> > share your
> > > thoughts on how to fix this? Much appreciated in advance!
> > >
> > > // set up call to R function "R_function"
> > > SEXP func_R;
> > > PROTECT(func_R=lang2(install("R_function"), func_data));
> > >
> >
> > It all depends on the environment where you evaluate that
> expression,
> > just as it would if it was R code. You can't see internal
> package
> > functions from the global environment, you need to evaluate
> them in the
> > package namespace environment.
> >
> > Duncan Murdoch
> >
>
More information about the R-package-devel
mailing list