r - 有什么方法可以使用 sourceCpp() 制作中缀函数
问题描述
我想知道是否可以制作一个中缀函数,例如A %o% B
使用 Rcpp。
我知道使用该inline
软件包可以做到这一点,但是在使用sourceCpp()
.
当参数肯定是使用and的向量时,我对%o%
/做了以下中缀实现:outer()
RcppEigen
inline
`%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
?
解决方案
是否可以通过 使中缀功能可用
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 端做任何进一步的事情。
推荐阅读
- django - 使用 URL Dispatcher 遇到 404 错误
- microsoft-graph-api - 使用 Microsoft Graph API 使用电子邮件别名获取用户主电子邮件地址
- kubernetes - 在 Kubernetes 的路径中使用变量
- python - Python Tkinter - 使用 ttk.Notebook 和 tkinter.Text 打开多个文件
- bash - 在 SLURM 上运行带有命令行参数的命令
- node.js - CheerioJS 变得具体
- 标题文本“我想要什么”
- sql - 如何使用字段 Postgres 更新表
- swift - 如何在特定时间安排通知,然后每 x 时间重复一次?
- c++ - 尝试使用 Box2D 的 b2Body::SetUserData(void*) 时未定义的引用
- node.js - 如何将猫鼬模式从唯一的 true 更改为唯一的 false