【问题标题】:Using `c++` class templates into `R`在 `R` 中使用 `c++` 类模板
【发布时间】:2019-01-13 00:32:09
【问题描述】:

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

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

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

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());
        };


    }
}

【问题讨论】:

标签: c++ c++11 templates rcpp


【解决方案1】:

这是一个非常广泛的问题,所以我只能提供一些可能对您有所帮助的建议:

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

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

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

【讨论】:

    猜你喜欢
    • 2018-07-08
    • 1970-01-01
    • 1970-01-01
    • 2018-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多