[Rcpp-devel] sugar: ifelse, pmin, pmax, lapply

Romain Francois romain at r-enthusiasts.com
Sat Jun 19 12:58:17 CEST 2010


Hi,

I've implemented lazy versions of them in Rcpp::sugar.

Here are some examples:

fx <- cxxfunction( signature( x = "integer" ), '
	IntegerVector xx(x) ;
	List res = lapply( xx, seq_len );
	return res ;	
', plugin = "Rcpp" )
checkEquals( fx( 1:10 ), lapply( 1:10, seq_len ) )



fx <- cxxfunction( signature( x = "numeric" ), '
		NumericVector xx(x) ;
		return List::create(
			pmin( xx, 5),
			pmin( 5, xx)
			) ;
	', plugin = "Rcpp" )
	
checkEquals( fx(1:10) ,
	list(
		c(1:5,rep(5,5)),
		c(1:5,rep(5,5))
	)
)


fx <- cxxfunction( signature( x = "numeric", y = "numeric" ), '
	NumericVector xx(x) ;
	NumericVector yy(y) ;
	
	NumericVector res = ifelse( xx < yy, xx*xx, -(yy*yy) ) ;
	return res ;
', plugin = "Rcpp" )

x <- 1:10
y <- 10:1
checkEquals( fx( x, y), ifelse( x<y, x*x, -(y*y) ) )


One thing to notice about ifelse is that it only evaluates either the 
rhs or the lhs, given the condition. This differs from R which has to 
evaluate both.

Romain

-- 
Romain Francois
Professional R Enthusiast
+33(0) 6 28 91 30 30
http://romainfrancois.blog.free.fr
|- http://bit.ly/98Uf7u : Rcpp 0.8.1
|- http://bit.ly/c6YnCi : graph gallery collage
`- http://bit.ly/bZ7ltC : inline 0.3.5



More information about the Rcpp-devel mailing list