1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66
|
\name{cxxfunction}
\alias{cxxfunction}
\title{
inline C++ function
}
\description{
Functionality to dynamically define an R function with inlined C++ code
using the \code{\link{.Call}} calling convention
}
\usage{
cxxfunction(sig = character(), body = character(),
plugin = "default", includes = "",
settings = getPlugin(plugin), ..., verbose = FALSE)
}
\arguments{
\item{sig}{Signature of the function. A named character vector}
\item{body}{A character vector with C++ code to include in the body of the compiled C++ function}
\item{plugin}{Name of the plugin to use. See \code{\link{getPlugin}} for details about plugins. }
\item{includes}{User includes, inserted after the includes provided by the plugin. }
\item{settings}{Result of the call to the plugin}
\item{\dots}{Further arguments to the plugin}
\item{verbose}{verbose output}
}
\value{
A function
}
\seealso{
\code{\link{cfunction}}
}
\examples{
\dontrun{
# default plugin
fx <- cxxfunction( signature(x = "integer", y = "numeric" ) , '
return ScalarReal( INTEGER(x)[0] * REAL(y)[0] ) ;
' )
fx( 2L, 5 )
# Rcpp plugin
if( require( Rcpp ) ){
fx <- cxxfunction( signature(x = "integer", y = "numeric" ) , '
return wrap( as<int>(x) * as<double>(y) ) ;
', plugin = "Rcpp" )
fx( 2L, 5 )
}
# RcppArmadillo plugin
if( require( RcppArmadillo ) ){
fx <- cxxfunction( signature(x = "integer", y = "numeric" ) , '
int dim = as<int>( x ) ;
arma::mat z = as<double>(y) * arma::eye<arma::mat>( dim, dim ) ;
return wrap( arma::accu(z) ) ;
', plugin = "RcppArmadillo" )
fx( 2L, 5 )
}
}
}
\keyword{programming}
\keyword{interface}
|