2

查看 Rcpp 作者的论文,我在第 6 页和第 7 页看到,只要是“可包装的” map<T>,就可以从 C++ 传递到 R。我有一个我想传递给 R 的东西。我希望可以将钥匙投射到或其他东西中,但我知道这不是魔术。map<string,T>Tmap<double,vector<double> >doublestringwrap

你有什么建议可以让我在不将整个地图复制到另一个地图的情况下输出这样的地图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列表,但我的东西看起来像菜鸟问题,所以我不想发垃圾邮件。

4

1 回答 1

4

您甚至无法测试双精度的相等性(请参阅R FAQ 7.31),因此我看不出如何索引映射或双精度的哈希。

通常,“自动”转换发生在 C++ 和 R 的隐式形式as<>()wrap()在两边都有相应的类型(即向量、列表、... of 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>
于 2013-02-28T13:09:18.177 回答