我想知道是否可以制作中缀函数,例如A %o% B使用 Rcpp。
我知道使用该inline包可以做到这一点,但是在使用sourceCpp().
当参数肯定是使用and 的向量时,我已经对%o%/进行了以下中缀实现:outer()RcppEigeninline
`%op%` <- cxxfunction(signature(v1="NumericVector",
v2="NumericVector"),
plugin = "RcppEigen",
body = c("
NumericVector xx(v1);
NumericVector yy(v2);
const Eigen::Map<Eigen::VectorXd> x(as<Eigen::Map<Eigen::VectorXd> >(xx));
const Eigen::Map<Eigen::VectorXd> y(as<Eigen::Map<Eigen::VectorXd> >(yy));
Eigen::MatrixXd op = x * y.transpose();
return Rcpp::wrap(op);
"))
Run Code Online (Sandbox Code Playgroud)
这可以很容易地实现以使用 导入sourceCpp(),但不能作为中缀函数。
我目前的尝试如下:
#include <Rcpp.h>
using namespace Rcpp;
#include <RcppEigen.h>
// [[Rcpp::depends(RcppEigen)]]
// [[Rcpp::export]]
NumericMatrix outerProd(NumericVector v1, NumericVector v2) {
NumericVector xx(v1);
NumericVector yy(v2);
const Eigen::Map<Eigen::VectorXd> x(as<Eigen::Map<Eigen::VectorXd> >(xx));
const Eigen::Map<Eigen::VectorXd> y(as<Eigen::Map<Eigen::VectorXd> >(yy));
Eigen::MatrixXd op = x * y.transpose();
return Rcpp::wrap(op);
}
Run Code Online (Sandbox Code Playgroud)
所以总结一下我的问题..是否可以通过sourceCpp?
是否可以通过 使中缀函数可用
sourceCpp?
是的。
与往常一样,人们应该阅读Rcpp小插曲!特别是在这里,如果您查看Rcpp 属性小插图的第 1.6 节,您会看到您可以使用 的 name 参数修改函数的名称Rcpp::export。例如,我们可以这样做:
#include <Rcpp.h>
// [[Rcpp::export(name = `%+%`)]]
Rcpp::NumericVector add(Rcpp::NumericVector x, Rcpp::NumericVector y) {
return x + y;
}
/*** R
1:3 %+% 4:6
*/
Run Code Online (Sandbox Code Playgroud)
然后我们会得到:
Rcpp::sourceCpp("~/infix-test.cpp")
> 1:3 %+% 4:6
[1] 5 7 9
Run Code Online (Sandbox Code Playgroud)
因此,您仍然必须在代码中为 C++ 函数命名有效的 C++ 名称,但您可以通过 name 参数将其导出到 R,Rcpp::export而无需在 R 端做任何进一步的事情。
| 归档时间: |
|
| 查看次数: |
93 次 |
| 最近记录: |