[R-pkg-devel] For reproducibility issue

Ivan Krylov kry|ov@r00t @end|ng |rom gm@||@com
Fri Jan 17 15:39:14 CET 2020


On Fri, 17 Jan 2020 13:55:39 +0000
وليد خلف معوض المطيرى <wkmtierie using qu.edu.sa> wrote:

> So, does anyone have an idea of how to solve this issue.

"Writing R Extensions", 1.6. Writing portable packages:

>> Compiled code should not call the system random number generators
>> such as rand, drand48 and random, but rather use the interfaces to
>> R’s RNGs described in Random numbers. In particular, if more than
>> one package initializes the system RNG (e.g. via srand), they will
>> interfere with each other.

>> Nor should the C++11 random number library be used, nor any other
>> third-party random number generators such as those in GSL.

It somewhat less convenient to call the R random number generator from
Fortran than it would be from C or C++, but still possible. There is a
F77-style example of such use [1], but since you are already using
iso_c_binding, you should be able to declare the C API [2] right in the
Fortran source:

subroutine GetRNGState() bind(c)
end subroutine

subroutine PutRNGstate() bind(c)
end subroutine

As a bonus, you get to use the R distribution functions [3], without
the need to implement them yourself from uniformly distributed samples:

function rnorm(mu, sigma) bind(c) result(ret)
 use intrinsic, iso_c_binding, only: c_double
 real(c_double), value :: mu, sigma
 real(c_double) ret
end function

function rgamma(shape, scale) bind(c) result(ret)
 use intrinsic, iso_c_binding, only: c_double
 real(c_double), value :: shape, scale
 real(c_double) ret
end function

(The prototypes above are unchecked; I haven't written any Fortran 2003
in more than a year.)

-- 
Best regards,
Ivan

[1]:
https://cran.r-project.org/doc/manuals/R-exts.html#index-Random-numbers-in-Fortran

[2]: https://cran.r-project.org/doc/manuals/R-exts.html#Random-numbers

[3]:
https://cran.r-project.org/doc/manuals/R-exts.html#Distribution-functions



More information about the R-package-devel mailing list