从C++; 假设我有一个C++程序,它有一个对象向量,我想把它写入RDATA DATA帧文件,每个向量的元素都是一个观察值。我该怎么做?这里有一个例子。如果我有 vector<Student> myStudents; vector mystudent;

从C++; 假设我有一个C++程序,它有一个对象向量,我想把它写入RDATA DATA帧文件,每个向量的元素都是一个观察值。我该怎么做?这里有一个例子。如果我有 vector<Student> myStudents; vector mystudent;,c++,r,C++,R,而Student是一个有两个数据成员的类,name类型为std::string和grade类型为int 写csv文件是我唯一的选择吗 请注意,Rdata是一种二进制格式,所以我想我需要使用一个库 对Rdata[r][C++]的搜索结果是空的。我认为没有人愿意从r源中提取二进制文件编写器,以便独立于r使用 大约二十年前,我对倍频程文件做了同样的处理,因为它们的格式很简单:两个整数代表'n'和'k',后跟数据的'n*k',因此可以通过每个函数调用进行读/写 我担心对于R,您必须覆盖太多的R头——因此

Student
是一个有两个数据成员的类,
name
类型为
std::string
grade
类型为
int

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

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


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

我认为没有人愿意从r源中提取二进制文件编写器,以便独立于r使用

大约二十年前,我对倍频程文件做了同样的处理,因为它们的格式很简单:两个整数代表'n'和'k',后跟数据的'n*k',因此可以通过每个函数调用进行读/写

我担心对于R,您必须覆盖太多的R头——因此最简单的(?)途径可能是将数据提供给R,可能是通过Rserve(“tcp/ip上的松散”连接)和RInside(通过嵌入实现更紧密的连接),然后让R写入


编辑:自原始答案编写以来的几年中,已经创建了一个这样的库:。

我不知道这是否适合每个人的需要(搜索这个问题的人),但通过这种方式,您可以保存单个或多个变量:

使用名称空间std;
使用名称空间Rcpp;
使用特征::映射;
使用Eigen::MatrixXi;
使用特征::矩阵XXD;
环境基础(“包:基础”);
函数save=base[“save”];
函数saveRDS=base[“saveRDS”];
MatrixXd M=MatrixXd::Identity(3,3);
数值矩阵xx(wrap(M));
数值矩阵xx1(wrap(M));
数值矩阵xx2(wrap(M));
基数[“xx”]=xx;
基数[“xx1”]=xx1;
基数[“xx2”]=xx2;
向量lst;
一、推回(“xx”);
一、推回(“xx1”);
一、推回(“xx2”);
CharacterVector全部=换行(lst);
保存(名为(“列表”,全部)、名为(“envir”,base)、名为(“文件”、“标识.RData”);
saveRDS(xx,命名为“file”,“Identity.RDs”);
返回包装(M);
库(内联)
图书馆(Rcpp)
图书馆(RcppEigen)

src这里是一个将列表保存在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";
}
void保存列表数据(常量列表和列表数据、常量字符向量和文件名)
{
环境基础(“包:基础”);
Environment env=new_env();
env[“列表数据”]=列表数据;
函数save=base[“save”];
字符向量all(1);
所有[0]=“列表数据”;
保存(名为(“列表”,全部),名为(“环境”,环境),名为(“文件”,文件名));

Rcout你能提供一个所需文件格式的简单示例吗?@MathematicalIAN1975当然可以,但它是二进制格式(更新帖子提到这一点)一个例子仍然有用吗?我认为你最好使用R API并在长时间写一个C++扩展。不要看普通的R用户,但是检查一下这里可能有帮助。@ Ivarpoiss谢谢。RCPP很棒。但是,它在R中运行。我仍然想在 R>代码>之外写一个RDATA文件。例如,我想我的合作伙伴。de在未安装
R
的情况下可用。