gpt4 book ai didi

c++ - 如何使用 Rcpp 将 map 从 C++ 传递到 R

转载 作者:搜寻专家 更新时间:2023-10-31 01:11:14 25 4
gpt4 key购买 nike

查看 Rcpp 作者的 paper ,我在第 6 页和第 7 页看到 map<T>map<string,T>可以从 C++ 传递到 R,只要 T是“可包装的”。我有一个 map<double,vector<double> >我想传递给 R。我希望 double key 可以转换为 stringwrap什么的,但我知道这不是魔法。

你有什么建议可以让我输出这样的 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 、列表、... of double、int、...)和显式您在其中创建自己的转换器。您仍然可以为您的容器执行此操作,只是不能自动执行,因为我们不提供魔术棒。

编辑: 好吧,刚在火车上吃过这个。您可以在 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/exportable 访问。它甚至可以工作:

R> Rcpp::sourceCpp('/tmp/maptest.cpp')
R> bar()
brown fox quick
2.22 1.11 3.14
R>

关于c++ - 如何使用 Rcpp 将 map<double,T> 从 C++ 传递到 R,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15135900/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com