在Rcpp

时间:2018-04-25 09:39:17

标签: c++ r boost rcpp

在我的C ++脚本中(使用Rcpp在R中运行),我定义了:

typedef boost::array< double ,3 > state_type;

现在,我想创建一个函数来将state_type变量转换为Rcpp :: NumericVector变量,以及另一个执行反转的函数。怎么办? 我需要这样做才能将R函数用于C ++。

2 个答案:

答案 0 :(得分:3)

如果您希望无缝集成,则必须扩展Rcpp::as<T>(obj)Rcpp::wrap(obj)。小插图Extending Rcpp涵盖了如何做到这一点。但是,还有一个excellent entry in the Rcpp gallery已经涵盖了一个非常相似的案例:转换为boost::numeric::ublas::vector<double>和从state_type转换。

如果您对仅使用#include <RcppCommon.h> // [[Rcpp::depends(BH)]] #include <boost/array.hpp> typedef boost::array< double ,3 > state_type; namespace Rcpp { // non-intrusive extension via template specialisation template <> state_type as(SEXP s); // non-intrusive extension via template specialisation template <> SEXP wrap(const state_type &s); } #include <Rcpp.h> // define template specialisations for as and wrap namespace Rcpp { template <> state_type as(SEXP stsexp) { Rcpp::NumericVector st(stsexp); state_type result; if (st.size() != result.size()) Rcpp::stop("Incompatible length!"); std::copy(st.begin(), st.end(), result.begin()); return result; } template <> SEXP wrap(const state_type &st) { Rcpp::NumericVector result(st.size()); std::copy(st.begin(), st.end(), result.begin()); return Rcpp::wrap(result); } } // make use of the new possibilities // [[Rcpp::export]] state_type alterStateType(state_type &st) { for (size_t i = 0; i < st.size(); ++i) { st[i] = i * st[i]; } return st; } /*** R alterStateType(1:3) */ 而非常规模板感到满意,那么您可以使用以下内容:

192

答案 1 :(得分:2)

怎么样

Rcpp::NumericVector boost_array_to_nvec(state_type const& s) {
    Rcpp::NumericVector nvec(s.size());
    for (size_t i = 0; i < s.size(); ++i) {
        nvec[i] = s[i];
    }
    return nvec;
}
state_type nvec_to_boost_array(Rcpp::NumericVector const& nvec) {
    state_type s;
    for (size_t i = 0; i < s.size(); ++i) {
        s[i] = nvec[i];
    }
    return s;
}
...
state_type s {0,0,0};
Rcpp::NumericVector nvec = boost_array_to_nvec(s);
s = nvec_to_boost_array(nvec);

如果你必须这么做很多次。这可能不是进行转换的最有效方式。但现在你必须看看nvec已经分配到正确的大小。

void boost_array_to_nvec(state_type const& s, Rcpp::NumericVector& nvec) {
    for (size_t i = 0; i < s.size(); ++i) {
        nvec[i] = s[i];
    }
}
void nvec_to_boost_array (Rcpp::NumericVector const& nvec, state_type& s) {
    for (size_t i = 0; i < s.size(); ++i) {
        s[i] = nvec[i];
    }
}
...
state_type s {0,0,0};
Rcpp::NumericVector nv(3);
boost_array_to_nvec(s, nv);
nvec_to_boost_array(nv, s);