首页 > 解决方案 > 有什么方法可以使用 sourceCpp() 制作中缀函数

问题描述

我想知道是否可以制作一个中缀函数,例如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);
                           "))

这可以很容易地实现以使用 导入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);
}

所以总结一下我的问题.. 是否可以通过 使中缀函数可用sourceCpp

标签: rrcpp

解决方案


是否可以通过 使中缀功能可用sourceCpp

的。

与往常一样,应该阅读Rcpp小插曲!特别是在这里,如果您查看Rcpp 属性 vignette的第 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
*/

然后我们会得到:

Rcpp::sourceCpp("~/infix-test.cpp")

> 1:3 %+% 4:6
[1] 5 7 9

因此,您仍然必须在代码中为 C++ 函数命名有效的 C++ 名称,但是您可以通过 name 参数将其导出到 R,Rcpp::export而无需在 R 端做任何进一步的事情。


推荐阅读