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.dun...@gmail.com <mailto:murdoch.dun...@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


______________________________________________
R-package-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-package-devel

Reply via email to