7

Rdatadata.frameファイルに書き出すオブジェクトのベクトルを持つC++プログラムがあり、ベクトルの要素ごとに1つの観測値があるとします。どうやってやるの?これが例です。私が持っているとしましょう

vector<Student> myStudents;

Andは、タイプとタイプのStudent2つのデータメンバーを持つクラスです。namestd::stringgradeint

csvファイルを作成する唯一のオプションはありますか?

Rdataはバイナリ形式なので、ライブラリを使用する必要があると思います。

Rdata [r][C++]の検索が空になりました。

4

3 に答える 3

8

Rから独立して使用するためにRソースからバイナリファイルライターを抽出することを気にした人はいないと思います。

ほぼ20年前、Octaveファイルについても同じことを行いました。形式は単純です。つまり、「n」と「k」の2つの整数の後に、データの「n * k」が続きます。つまり、それぞれ2つの関数呼び出しで読み取り/書き込みを行うことができます。 。

Rの場合、Rのヘッダーの数が多すぎるのではないかと心配しています。したがって、最も簡単な(?)ルートは、Rserve(tcp / ipを介した「緩い」接続)とRInside(より緊密な)を介してRにデータを提供することです。埋め込みによる接続)、Rに書き込んでもらいます。

編集:元の回答が書かれてから数年で、そのようなライブラリの1つが作成されました:librdata

于 2012-06-11T11:08:13.397 に答える
0

これが(この質問をグーグルしている人の)すべてのニーズに合うかどうかはわかりませんが、この方法で、個々の変数または複数の変数を保存できます。

using namespace std;
using namespace Rcpp;
using Eigen::Map; 
using Eigen::MatrixXi;
using Eigen::MatrixXd;

Environment base("package:base");

Function save = base["save"];
Function saveRDS = base["saveRDS"];

MatrixXd M = MatrixXd::Identity(3,3);

NumericMatrix xx(wrap(M));
NumericMatrix xx1(wrap(M));
NumericMatrix xx2(wrap(M));

base["xx"] = xx;
base["xx1"] = xx1;
base["xx2"] = xx2;

vector<string> lst;
lst.push_back("xx");
lst.push_back("xx1");
lst.push_back("xx2");
CharacterVector all = wrap(lst);

save(Named("list", all), Named("envir", base) , Named("file","Identities.RData"));
saveRDS(xx,Named("file","Identity.RDs"));
return wrap(M);
library(inline)
library(Rcpp)
library(RcppEigen)

src <- '
#put here cpp code shown above 
'

saveworkspace <- cxxfunction(signature(), src, plugin = "RcppEigen")
saveworkspace()
list.files(pattern="*.RD*")


[1] "Identity.RDs"
[2] "Identities.RData"

このC++コードがスタンドアロンのライブラリ/実行可能ファイルで機能するかどうかは100%わかりません。

注意:最初は、ソリューションはから独立している必要があるというコメントを見逃しましたがR、まったく同じ質問を検索しているが、に依存しても問題ない場合はR、これが役立つ可能性があります。

于 2015-06-22T14:55:54.737 に答える
0

リストをRDataに保存する関数の例を次に示します。この例は、前の回答に基づいています。

void save_List_RData(const List &list_Data, const CharacterVector &file_Name)
{
  Environment base("package:base");
  Environment env = new_env();
  env["list_Data"] = list_Data;
  Function save = base["save"];
  CharacterVector all(1);
  all[0] = "list_Data";
  save(Named("list", all), Named("envir", env), Named("file", file_Name));
  Rcout << "File " << file_Name << " has been saved! \\n";
}
于 2020-12-21T15:56:29.267 に答える