2

Rcppの作者の論文を見ると、6ページと7ページで、map<T>「ラップ可能」であるmap<string,T>限り、C++からRに渡すことができることがTわかります。私はmap<double,vector<double> >Rに渡すのが好きだと思っています。doubleキーが何かにキャストされることを望んでいましたがstringwrapそれは魔法ではないことを理解しています。

マップ全体を別のマップにコピーせずにそのようなマップを出力できるようにする提案があります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ますが、私のものはnoobの質問のように見えるので、スパムを送りたくありません。

4

1 に答える 1

4

ダブルで同等性をテストすることすらできないので(R FAQ 7.31を参照)、ダブルでマップまたはハッシュにインデックスを付ける方法がわかりません。

一般に、「自動」変換は、C ++とRの両側に対応する型(つまり、double、int、...のベクトル、リスト、...)があり、独自のコンバーターを作成する明示的な形式のas<>()場合wrap()発生します。あなたはまだあなたのコンテナのためにそれをすることができます、私たちが魔法の杖を届けないのでそれはただ自動化することができません。

編集:わかりました、電車の中でこれを使ってヌードルしました。C ++では両方の方法でビルドできますが、可能な表現(文字列ラベル付きのdouble)にのみ存在するため、(自動的に)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 に答える