From gmbecker at ucdavis.edu  Thu Jun 30 23:38:56 2016
From: gmbecker at ucdavis.edu (Gabriel Becker)
Date: Thu, 30 Jun 2016 14:38:56 -0700
Subject: [Rd] Calling C implementations of rnorm and friends
In-Reply-To: <CAOeuMBBshUcPrwBbgZdMZTgRYo3WEqia0O9DSWp4GEmuO7R=oQ@mail.gmail.com>
References: <CAOeuMBBshUcPrwBbgZdMZTgRYo3WEqia0O9DSWp4GEmuO7R=oQ@mail.gmail.com>
Message-ID: <CADwqtCNxchG_VL3Fe0Hqvvco7-BoiJ1SvRA1SAz7uVSa8yW4qA@mail.gmail.com>

Luis,

C_rnorm is a symbol but it's not exported.  This means that you *can* do
this by using stats:::C_rnorm.

That said, it's not exported, which means that it's not supported to do
this. So your package likely would not be allowed on CRAN, for example.

Best,
~G
On Jun 30, 2016 2:08 PM, "Luis Usier" <luis.henrique.usier at gmail.com> wrote:

> Hi all,
>
> Looking at the body for the function rnorm, I see that the body of the
> function is:
>
>     .Call(C_rnorm, n, mean, sd)
>
> I want to implement functions that generate normal (and other) random
> variables. Now, I understand that I can perfectly well just call the R
> wrapper for these functions and that will be almost indistinguishable for
> most purposes, but for whatever reason I wanted to try and call the C
> function directly. My first instinct was to call them as:
>
>     .Call(C_rnorm, 1, 1, 1)
>
> This doesn't work because R assumes C_rnorm is an object. Looking at the
> documentation for .Call, I try passing it in as a string:
>
>     .Call("C_rnorm", 1, 1, 1, PACKAGE = "stats")
>
> This doesn't work either. The help page links to getNativeSymbolInfo(),
> which I can't make work either. It also refers me to the dyn.load()
> function and the "Writing R  Extensions" manual.
>
> After reading and trying to digest those, I try
>
>     getDLLRegisteredRoutines("stats")
>
> which shows me all the C and Fortran functions as registered routines,
> along with their number of parameters. I retrieve rnorm from the list and
> pass it on to .Call, which then works fine.
>
> However, is there an easier way to do this? Specifically, I would like to
> call the DLL registered routines from within functions in a package I am
> writing. The manual tells me I should use useDynLib(). So if I added
> useDynLib("stats") to my namespace, would that work? Could I then have a
> function such as:
>
>     function(x, y, z) .Call(C_rnorm, x, y, z)
>
> in my package? If not, what is the proper way of calling these functions
> from other packages? Should I use "C_rnorm" or "norm"?
>
> Also, I was looking for the C source code of rnorm, because I wanted to
> understand how the function works. Looking at Winston Chang's github R
> mirror, I found rnorm in the random.c file in the stats package. However,
> the code I find for it:
>
>
>
> #define DEFRAND2_REAL(name) \
> SEXP do_##name(SEXP sn, SEXP sa, SEXP sb) { \
>     return random2(sn, sa, sb, name, REALSXP); \
> }
> DEFRAND2_REAL(rnorm)
>
>
> Doesn't help me at all in understanding how it works. It should create a
> function random2(sn, sa, sb, norm, REALSXP); I understand that is a version
> of the random2 function that returns a real S expression taking sn, sa and
> sb as parameters. But how does find the actual functional form for the
> normal distribution?
>
> I am asking because I would like to rewrite some of the other functions,
> such as parameterizing rbeta by the mean and sample size rather than by the
> number of successes and failures and rgamma by the mean and total time
> elapsed instead of the number of events. Once I understand how the C source
> code works, it would be hopefully not very difficult to reparameterize
> them.
>
> Thanks,
>
> Luis Usier
>
>         [[alternative HTML version deleted]]
>
> ______________________________________________
> R-devel at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel
>

	[[alternative HTML version deleted]]



[Rd] Calling C implementations of rnorm and friends
Gabriel Becker