在 `R` 中使用 `c++` class 模板

Using `c++` class templates into `R`

第一次看how to write wrap functions that allow me to interface with a class template I have created in c++,有几个问题。

如何使用 Rcpp::depends 属性来声明对我创建的静态库的依赖项?我想我需要在某处指定一个路径,但这里的所有示例都只引用众所周知的库。

当我尝试在 R 会话中使用这些东西时,我可以使用哪些 R 类型的选项?我有 c++ 类 不仅包含一些数据,而且它们还有处理这些数据和更改状态的方法。这个例子似乎只改变了 vector 到另一个。有没有人对如何实现这一目标有任何示例或建议?

namespace Rcpp {

    namespace traits{

        // Defined wrap case
        template <typename T> SEXP wrap(const boost::numeric::ublas::vector<T> & obj){
            const int RTYPE = Rcpp::traits::r_sexptype_traits<T>::rtype ;

            return Rcpp::Vector< RTYPE >(obj.begin(), obj.end());
        };


    }
}

这是一个很宽泛的问题,所以我只能给出一些可能对你有帮助的建议:

  • Rcpp::depends 属性不是针对外部库的依赖项,而是针对其他 R 包的依赖项。这些 R 包可能会提供库(例如 RcppArmadillo 或 RcppEigen)或必要的基础设施 link 与系统库(例如 RcppGSL)。后者是通过插件实现的,c.f。 RcppGSL::inlineCxxPlugin()。插件也可以在没有额外包的情况下使用,c.f。 here.

  • 如果你想在 C++ 对象中维护状态,你必须考虑它的生命周期。如果它是一个单例对象,我喜欢使用匿名命名空间。否则,您可以使用 Rcpp::XPtr 将 C++ 对象带到 R。这也可以使用 RCPP_EXPOSED_CLASS 宏 c.f 来实现。 "Extending Rcpp" 小插图。

  • Rcpp 模块可能也值得一看。有关示例,请参阅相应的小插图和 RcppRedis 包。