This function wraps an existing function (.f) such that it returns rvars containing
whatever type of data .f would normally return.
The returned function, when called, executes .f possibly multiple times, once for each draw of
the rvars passed to it, then returns a new
rvar representing the output of those function evaluations. If the arguments contain no rvars,
then .f will be executed ndraws times and an rvar with that many draws returned.
Functions created by rfun() are not necessarily fast (in fact in some cases they may be very slow), but
they have the advantage of allowing a nearly arbitrary R functions to be executed against rvars
simply by wrapping them with rfun(). This makes it especially useful as a prototyping
tool. If you create code with rfun() and it is unacceptably slow for your application,
consider rewriting it using math operations directly on rvars (which should be fast),
using rvar_rng(), and/or using operations directly on the arrays that back the rvars
(via draws_of()).