7

假设我有一个 C++ 程序,它有一个对象向量,我想将其写入 Rdata data.frame 文件,向量的每个元素一个观察值。我怎样才能做到这一点?这是一个例子。假设我有

vector<Student> myStudents;

AndStudent是一个有两个数据成员的类,name一个是 type std::stringgrade一个是 type int

我唯一的选择是写一个 csv 文件吗?

请注意,Rdata 是二进制格式,所以我想我需要使用库。

搜索 Rdata [r] [C++] 是空的。

4

3 回答 3

8

我认为没有人费心从 R 源中提取二进制文件编写器以独立于 R 使用。

大约 20 年前,我对 Octave 文件做了同样的事情,因为它们的格式很简单:两个整数代表“n”和“k”,然后是“n * k”的数据——所以你可以用两个函数调用来读/写。 .

我担心对于 R,您将不得不覆盖太多 R 的标头 - 所以最简单的(?)路线可能是将数据提供给 R,可能是通过 Rserve(通过 tcp/ip 的“松散”连接)和 RInside(更紧密)通过嵌入连接),并让 R 编写它。

编辑:在编写原始答案后的几年中,已经创建了一个这样的库: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"

我不是 100% 确定这个 C++ 代码是否可以在独立的库/可执行文件中工作。

注意:最初我错过了解决方案应该独立于的评论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 回答