[R-pkg-devel] R_registerRoutines, etc.

Rolf Turner r.turner at auckland.ac.nz
Sun Apr 23 00:13:53 CEST 2017


On 23/04/17 09:44, Dirk Eddelbuettel wrote:
>
> On 23 April 2017 at 09:25, Rolf Turner wrote:

<SNIP>

> | However I found a posting by Ege Rubak on this topic which sent me by a
> | slightly roundabout route to a posting by Dirk Eddelbuttel
>
> There is a transcribed Umlaut in there:  Eddelbuettel (ie 'ue' not 'u')

Arrgggghhh!  Sorry 'bout that.  I'm usually fairly careful about getting 
people's names right, since I am myself annoyed by being called "Rolph" 
or "Ralph" or "Ralf" or "Ross" (!!!).

<SNIP>

> | (1) I found that having an R function with the same name as that of a
> | routine (Fortran subroutine in this case) that it called, causes all
> | sorts of chaos.  I had a function "binsrt" that called a Fortran
> | subroutine named "binsrt" and a function "mnnd" that called a Fortran
> | subroutine named "mnnd".  This induced several fairly mysterious
> | warnings.  I resolved the issue by renaming the R functions "binsrtR"
> | and "mnndR" respectively, so as to eliminate the name conflict.
> |
> | Would this be the recommended procedure, or is there a cleverer way to
> | eliminate the problem?
>
> That has hit me too, and I also found the error message less than perfectly
> clear.  It all makes sense in the large sense -- we now register functions,
> and R and compiled code (C++ for me, Fortran for you) "compete" for unique
> identifiers.
>
> The "official" way in Writing R Extensions fixes this by automagically
> prefixing functions called via .Call() with a "c_" prefix.  You can turn that
> on in the NAMESPACE file as further argument to useDynLib().  I am not (yet?)
> doing this in all packages, and I "spied" on one recent update of a package
> by an R Core member that didn;t either.  When in Rome ...

The foregoing "official" way would seem to apply to functions called by 
".Call" (which I never use; it is way over my head).  What about 
functions called by ".Fortran()" or ".C()"?

<SNIP>

> |     (b) For the sake of completeness, how *does* one replace the "void *"
> |         constructions with "actual types" in a correct manner?
> |
> |          Example:  In my init.c file I currently have (as produced by
> |          package_native_routine_registration_skeleton()) :
> |
> | > extern void F77_NAME(mnnd)(void *, void *, void *, void *, void *);
> |
> |          The code in mnnd.f reads:
> |
> | > subroutine mnnd(x,y,n,dminbig,dminav)
> | > implicit double precision(a-h,o-z)
> | > .....
> |
> |          I.e. the "actual types are "double precision",
> |          "double precision", "integer", "double precision",
> |          "double precision".
> |
> |          So in this case I should (?) replace
> |
> | > extern void F77_NAME(mnnd)(void *, void *, void *, void *, void *);
> |
> |          by .... what?  Can anyone tell me?
>
> No idea. I don't deal in Fortran. C++ is more than enough fun for me ;-)

Well, C++ is too much for me.  I find Fortran generally very easy.  Be 
that as it were, are there any Fortran users out there who can answer my 
question, above?

Thanks Dirk.

cheers,

Rolf

-- 
Technical Editor ANZJS
Department of Statistics
University of Auckland
Phone: +64-9-373-7599 ext. 88276



More information about the R-package-devel mailing list