[英]How to pass a map<double,T> from C++ to R with Rcpp
查看 Rcpp 作者的论文,我在第 6 页和第 7 页看到map<T>
和map<string,T>
可以从 C++ 传递到 R,只要T
是“可包装的”。 我有一个map<double,vector<double> >
我wouls像传递给R.我希望在double
键可以强制转换为string
在wrap
或东西,但我的理解是不是魔术。
你有什么建议可以让我输出这样的地图而不将整个地图复制到另一个map<string, vector<double>>
(毕竟这很可能是一个 C++ 问题)?
在下面找到一个map<double,string>
的例子map<double,string>
作为可复制的例子。
cCode <- '
map<double,string> myMap;
myMap[10.01] = "A1";
myMap[14.62] = "B1";
myMap[16.33] = "C1";
return wrap(myMap); //this failed
';
mapRet <- cxxfunction(signature(), includes='using namespace std;', plugin="Rcpp", body=cCode)
PS:我知道rcpp-devel
列表,但我的东西看起来像菜鸟问题,所以我不想发送垃圾邮件。
您甚至无法在 double 上测试相等性(请参阅R FAQ 7.31 ),因此我不知道如何在 double 上索引映射或散列。
一般来说,“自动”转换发生在as<>()
和wrap()
隐式形式,其中 C++ 和 R 在两边都有相应的类型(即向量、列表、...的 double、int、...)和明确您在哪里创建自己的转换器。 您仍然可以为您的容器执行此操作,只是不能自动执行,因为我们不提供魔杖。
编辑:好的,只是在火车上吃过这个。 您可以在 C++ 中以两种方式构建它,但您只能(自动)将它映射回 R,因为只有可能的表示形式:带有字符串标签的双精度型。 见证:
#include <Rcpp.h>
// [[Rcpp::export]]
std::map<std::string, double> bar() {
std::map<std::string, double> s;
s["quick"] = 3.14;
s["brown"] = 2.22;
s["fox"] = 1.11;
return s;
}
// [[Rcpp::export]]
std::map<double, std::string> foo() {
std::map<double, std::string> s;
s[3.14] = "quick";
s[2.22] = "brown";
s[1.11] = "fox";
return s;
}
并且两个函数都编译,但只有第一个可以从 R/exportable 访问。 它甚至有效:
R> Rcpp::sourceCpp('/tmp/maptest.cpp')
R> bar()
brown fox quick
2.22 1.11 3.14
R>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.