The Stan modeling language allows users to define their own functions in a 
  functions block at the top of a Stan program. The 
  expose_stan_functions utility function uses
  sourceCpp to export those user-defined functions
  to the specified environment for testing inside R or for doing posterior
  predictive simulations in R rather than in the generated 
  quantities block of a Stan program.
expose_stan_functions(stanmodel, includes = NULL, 
                        show_compiler_warnings = FALSE, ...)
  get_rng(seed = 0L)
  get_stream()The names of the new functions in env are returned invisibly.
A stanmodel object, a stanfit 
    object, a list produced by stanc or the path to a Stan 
    program (.stan file). In any of these cases, the underlying Stan 
    program should contain a non-empty functions block.
If not NULL (the default), then a character vector of
    length one (possibly containing one or more "\n") of the form 
    '#include "/full/path/to/my_header.hpp"', which will be inserted
    into the C++ code in the model's namespace and can be used to provide definitions 
    of functions that are declared but not defined in stanmodel
Logical scalar defaulting to FALSE that
    controls whether compiler warnings, which can be numerous and have never
    been relevant, are shown
An integer vector of length one indicating the state of Stan's pseudo-random number generator
Further arguments passed to sourceCpp.
The expose_stan_functions function requires as much compliance with
  the C++14 standard as is implemented in the RTools toolchain for Windows.
  On Windows, you will likely need to specify CXX14 = g++ -std=c++1y
  in the file whose path is normalizePath("~/.R/Makevars") in
  order for expose_stan_functions to work. Outside of Windows, the
  necessary compiler flags are set programatically, which is likely to suffice.
There are a few special types of user-defined Stan functions for which some additional details are relevant:
If a user-defined Stan function ends in _rng, then it can
  use the Boost pseudo-random number generator used by Stan. When exposing
  such functions to R, base_rng__ and pstream__ arguments will 
  be added to the formals. The base_rng__ argument should
  be passed the result of a call to get_rng (perhaps specifying its
  seed argument for reproducibility) and the pstream__ should
  be passed the result of a call to get_stream, which can be used to
  see the result of print and reject calls in the user-defined
  Stan functions. These arguments default to get_stream() and
  get_rng() respectively.
If a user-defined Stan function ends in _lp, then it can
  modify the log-probability used by Stan to evaluate Metropolis
  proposals or as an objective function for optimization. When exposing
  such functions to R, a lp__ argument will be added to the 
  formals. This lp__ argument defaults to zero, but a 
  double precision scalar may be  passed to this argument when the 
  function is called from R. Such a user-defined Stan function can terminate 
  with return target(); or can execute print(target()); to verify that 
  the calculation is correct.
sourceCpp and the section in the Stan User Manual on
  user-defined functions
if (FALSE) {
model_code <-
  '
  functions {
    real standard_normal_rng() {
      return normal_rng(0,1);
   }
  }
'
expose_stan_functions(stanc(model_code = model_code))
standard_normal_rng()
PRNG <- get_rng(seed = 3)
o <- get_stream()
standard_normal_rng(PRNG, o)
}
Run the code above in your browser using DataLab