[Rcpp-devel] more on stats functions

Dirk Eddelbuettel edd at debian.org
Wed Dec 8 05:36:47 CET 2010


On 7 December 2010 at 21:25, Christian Gunning wrote:
| > Your contributions are useful. It helps us understanding how people from
| > outside the team use Rcpp.
| 
| Thanks.  As per Dirk's comment, I went back to the unit tests and will
| use those as guidance for quickref.
| 
| The problem I got stuck on looks to be the use of int versus double
| values for dnorm's sd argument, due to argument ambiguity:
| 
| This works (copied from unitTests/runit.stats.R):
| 
| dtest1 = cxxfunction(signature( x = "numeric" ),
|           'NumericVector xx(x);
|            return( xx = dnorm( xx, 0.0, 1.0));'
|  ,plugin='Rcpp')
| 
| This doesn't compile (copied from Rcpp-sugar.pdf):
| 
| dtest2 = cxxfunction(signature( x = "numeric" ),
|           'NumericVector xx(x);
|            return(xx = dnorm( xx, 0, 1));'
|  ,plugin='Rcpp')
| 
| Compilation ERROR, function(s)/method(s) not created!
| file49322701.cpp: In function ‘SEXPREC* file49322701(SEXPREC*)’:
| file49322701.cpp:30: error: call of overloaded
| ‘dnorm4(Rcpp::NumericVector&, int, int)’ is ambiguous
| /home/xian/R/x86_64-pc-linux-gnu-library/2.8/Rcpp/include/Rcpp/stats/norm.h:107:
| note: candidates are: Rcpp::stats::D1<RTYPE, NA, T> Rcpp::dnorm4(const
| Rcpp::VectorBase<RTYPE, NA, VECTOR>&, double, bool) [with int RTYPE =
| 14, bool NA = true, T = Rcpp::Vector<14>]
| /home/xian/R/x86_64-pc-linux-gnu-library/2.8/Rcpp/include/Rcpp/stats/norm.h:108:
| note:                 Rcpp::stats::D2<RTYPE, NA, T> Rcpp::dnorm4(const
| Rcpp::VectorBase<RTYPE, NA, VECTOR>&, double, double, bool) [with int
| RTYPE = 14, bool NA = true, T = Rcpp::Vector<14>]
| make: *** [file49322701.o] Error 1

Confirmed, but colour me puzzled.
 
| This works:
| 
| dtest2a = cxxfunction(signature( x = "numeric" ),
|           'NumericVector xx(x);
|            return(xx = dnorm( xx, 0, 1, true));'
|  ,plugin='Rcpp')
| 
| This works, and is equivalent to dnorm(-2:2, 0, log=T) in R:
| 
| dtest3 = cxxfunction(signature( x = "numeric" ),
|           'NumericVector xx(x);
|            return(xx= dnorm( xx, 0, true));'
|  ,plugin='Rcpp')
| x=-2:2; identical(dtest3(x),  dnorm(x, 0, log=T))
| 
| This works, and is equivalent to dnorm(-2:2, 0, log=F) in R:
| 
| dtest4 = cxxfunction(signature( x = "numeric" ),
|           'NumericVector xx(x);
|            return(xx = dnorm( xx, 0, false));'
|  ,plugin='Rcpp')
| x=-2:2; identical(dtest4(x),  dnorm(x, 0, log=F))
| 
| To avoid ambiguity, is it reasonable to recommend that users of the
| stats functions provide all scalar arguments as doubles rather than
| integers, as is done in the unit tests (but not in Rcpp-sugar.pdf)?
| e.g.
|   pgamma( xx, 2.0, 1.0 )
| vs.
|   pgamma( xx, 2, 1 )
| 
| If so, I'll also patch Rcpp-sugar.pdf to reflect this.
| 
| In addition, some user guidance on what arguments are required for the
| stats functions should cut down on questions in the future (esp. since
| template compile errors can be daunting). For rnorm, all 3 of these
| work:
| 
| rtest = cxxfunction(,
|           'NumericVector xx = rnorm( 5);
|            xx = rnorm( 5, 0.0);
|            return(xx = rnorm( 5, 0.0, 1.0));'
|  ,plugin='Rcpp')
| 
| With dnorm, a smaller subset work (commented don't compile):
| 
| dtest5 = cxxfunction(signature( x = "numeric" ),
|           'NumericVector xx(x), yy(x);
|            //yy = dnorm( xx);
|            yy = dnorm( xx, 0.0);
|            yy = dnorm( xx, 0.0, 1.0);
|            yy = dnorm( xx, 0.0, 1.0, true);
|            yy = dnorm( xx, 0.0, true);
|            //yy = dnorm( xx, true);
|            return(yy);'
|  ,plugin='Rcpp')

It's tricky. While 'sugar' is clearly inspired by R, we do not have R
semantics.  So maybe we need to encourage the user as much as possible to
supply arguments.  I think Romain alluded to the 'no holes in the middle'
rule -- you do not get the same freedoms with positional and named arguments
that you have in R.

Anyway, end-of-day for me here.

Dirk

-- 
Dirk Eddelbuettel | edd at debian.org | http://dirk.eddelbuettel.com


More information about the Rcpp-devel mailing list