c++ - 如何使用 Rcpp 将映射<double,T> 从 C++ 传递到 R

标签 c++ r dictionary stl rcpp

查看 Rcpp 作者的 paper ,我在第 6 页和第 7 页看到 map<T>map<string,T>只要 T 就可以从 C++ 传递到 R是“可包装的”。我有一个map<double,vector<double> >我想传递给 R。我希望 double键可以转换为 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 、列表、... 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/

相关文章:

python - 反转字典中元素的顺序

python - 如何在 python 中添加两个 OrderedDict 对象的值,保持顺序?

python - 获取字典列表的最大键

R:如何使用 ... 将参数传递给定义良好的多个函数?

c++ - 如何使用 C++ 在任务计划程序中创建任务

c++ - "operator/"的分母

c++ - 在 C++ 中解析的好方法

c++ - 寻找可移植的 SOAP 客户端 C++ 库

r - 不断收到错误: Expecting a single value: [extent=2] in summarise

R 对 data.frame 中两个变量的惰性求值