查看 Rcpp 作者的 paper ,我在第 6 页和第 7 页看到 map<T>
和map<string,T>
只要 T
就可以从 C++ 传递到 R是“可包装的”。我有一个map<double,vector<double> >
我想传递给 R。我希望 double
键可以转换为 string
在 wrap
或其他东西,但我知道这不是魔法。
您有什么建议可以让我输出这样的 map ,而无需将整个 map 复制到另一个map<string, vector<double>>
(这毕竟可能是一个 C++ 问题)?
下面是 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 的相等性(请参阅 the R FAQ 7.31 ),因此我不知道如何在 double 上对映射或哈希进行索引。
一般来说,“自动”转换发生在 as<>()
的隐式形式中。和wrap()
其中 C++ 和 R 两侧都有相应的类型(即 vector 、列表、... double 、整数...)和显式您可以在其中创建自己的转换器。您仍然可以对容器执行此操作,只是不能自动执行,因为我们不提供魔杖。
编辑:好吧,只是在火车上吃这个。您可以用 C++ 两种方式构建它,但只能(自动)将其映射回 R,因为只有可能的表示形式:带有字符串标签的 double 。见证人:
#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/可导出访问。它甚至有效:
R> Rcpp::sourceCpp('/tmp/maptest.cpp')
R> bar()
brown fox quick
2.22 1.11 3.14
R>
关于c++ - 如何使用 Rcpp 将映射<double,T> 从 C++ 传递到 R,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15135900/