代码之家  ›  专栏  ›  技术社区  ›  Taylor

将`c++`类模板用于`R`

  •  -1
  • Taylor  · 技术社区  · 7 年前

    这是我第一次看 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());
            };
    
    
        }
    }
    
    1 回复  |  直到 7 年前
        1
  •  2
  •   Ralf Stubner    7 年前

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

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

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

    • Rcpp模块也值得一看。有关示例,请参见相应的vignette和RcppRedis包。