On looking more closely I can't use cxxfunction with plugin="Rcpp" to test this because the plugin inserts
#include <Rcpp.h> before the user includes and some parts in the user includes need to be declared before Rcpp.h is included. I'll create a small package. On Tue, Dec 7, 2010 at 10:06 AM, Douglas Bates <ba...@stat.wisc.edu> wrote: > I'm again trying to define instances of the wrap template for C++ > classes that have data members defined in Rcpp.h > > A stand-alone example, which is rather lengthy, is enclosed. In this > example I am unsuccessful in using the "intrusive" formulation > described in the "Extending Rcpp" vignette. I will try again with the > "non-intrusive" formulation. Other suggestions are welcome. > > library(Matrix) > library(inline) > library(Rcpp) > > incl <- ' > #include <RcppCommon.h> > > namespace Rcpp { > template <int RTYPE> class Vector; > template <int RTYPE> class Matrix; > class S4; > typedef Vector<REALSXP> NumericVector; > typedef Vector<INTSXP> IntegerVector; > typedef Vector<VECSXP> List; > typedef Matrix<REALSXP> NumericMatrix; > } > > class dtrMatrix { > protected: > Rcpp::NumericVector d_dat; > Rcpp::List d_dimnames; > int d_size; // must be square > bool d_upper; // true if upper triangular > bool d_unit; // true if unit diagonal > public: > dtrMatrix(Rcpp::S4&) throw (std::runtime_error); > operator SEXP(); > }; > > #include <Rcpp.h> > > dtrMatrix::dtrMatrix(Rcpp::S4& xp) throw (std::runtime_error) > : d_dat(xp.slot("x")), d_dimnames(xp.slot("Dimnames")) { > if (!xp.inherits("dtrMatrix")) > throw std::runtime_error("constructor needs S4 class dtrMatrix"); > IntegerVector dd = xp.slot("Dim"); > if (dd.size() != 2 || dd[0] != dd[1]) > throw std::runtime_error("Matrix must be square"); > d_size = dd[0]; > std::string uplo = as<std::string>(xp.slot("uplo")); > d_upper = (uplo == "U") || (uplo == "u"); > std::string diag = as<std::string>(xp.slot("diag")); > d_unit = (diag == "U") || (diag == "u"); > } > > dtrMatrix::operator SEXP() { > Rcpp::S4 ans("dtrMatrix"); > ans.slot("x") = clone(d_dat); > ans.slot("Dimnames") = clone(d_dimnames); > IntegerVector dd(2); > dd[0] = dd[1] = d_size; > ans.slot("Dim") = dd; > ans.slot("uplo") = d_upper ? "U" : "L"; > ans.slot("diag") = d_unit ? "U" : "N"; > return ans; > } > ' > > code <- ' > dtrMatrix x(S4(x_)); > return wrap(x); > ' > ff <- cxxfunction(signature(x_ = "ANY"), code, incl, plugin="Rcpp") > > example("dtrMatrix-class") > ff(T) > _______________________________________________ Rcpp-devel mailing list Rcpp-devel@lists.r-forge.r-project.org https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel