在 `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 包。
第一次看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 包。