我想能够在R
中使用c++
类模板。这是我的第一次尝试,提供了一个小的可重现示例。
library(inline)
library(Rcpp)
inc <-
"#include <Eigen/Dense>
template <size_t dim>
class SillyWrapper
{
public:
Eigen::Matrix<double,dim,1> m_vec;
SillyWrapper(const Eigen::Matrix<int,dim,1>& vec) : m_vec(vec);
};"
src <-
'SillyWrapper mything(Rcpp::as<Eigen::Map<Eigen::Matrix<double,dim,1>>>(x));'
library(inline)
fun <- cxxfunction(signature(x="numeric"),
body=src,
includes=inc,
plugin="Rcpp")
fun(rnorm(3))
如何访问Eigen头文件?
在我的机器上,它们位于/usr/include/eigen3/
。我认为我需要“注册一个插件”。我不确定这个文件路径要放在哪里。我尝试过一些命名参数,但是没有成功。以下是一个我尝试过但无法工作的示例:
library(inline)
library(Rcpp)
inc <-
'template <size_t dim>
class SillyWrapper
{
public:
Eigen::Matrix<double,dim,1> m_vec;
SillyWrapper(const Eigen::Matrix<int,dim,1>& vec) : m_vec(vec);
};'
src <-
'SillyWrapper mything(Rcpp::as<Eigen::Map<Eigen::Matrix<double,dim,1>>>(x));'
plug <- Rcpp.plugin.maker(include.before = "#include <Eigen/Dense>",
LinkingTo = "-I/usr/include/eigen3/") # correct arg name?
inline::registerPlugin("eigenDemo", plug)
fun <- cxxfunction(signature(x="numeric"),
body=src,
includes=inc,
plugin="eigenDemo")
我知道已经存在一个名为RcppEigen的库,可以帮助解决这个例子。如果可能的话,我希望看到一种不使用它的答案,因为这将更适用于其他没有该库的情况。此外,你在哪里放置c++11标志?显然,你只能一次使用一个插件来使用。
编辑:
谢谢@RalfStubner。对于那些感兴趣的人,我已经发布了一个后续问题here。
LinkingTo: RcppEigen
,R会自动帮你找到头文件。 - Dirk Eddelbuettelconfigure
逻辑和其他任何尝试确保其所需资源存在的软件包一样。 - Dirk Eddelbuettel