假设我有一个C ++程序,它有一个对象向量,我想写出一个Rdata data.frame文件,每个向量元素一个观察。我怎样才能做到这一点?这是一个例子。假设我有
vector<Student> myStudents;
Student
是一个有两个数据成员的类,name
类型为std::string
,grade
类型为int
。
我是编写csv文件的唯一选择吗?
请注意,Rdata是二进制格式,所以我想我需要使用库。
搜索Rdata [r] [C ++]时出现空白。
答案 0 :(得分:5)
我认为没有人愿意从R源提取二进制文件编写器以独立于R使用。
差不多二十年前,我为Octave文件做了同样的事情,因为它们的格式很简单:'n'和'k'两个整数,后跟'n * k'数据 - 所以你可以用两个读/写函数调用每个。
我担心对于R你必须覆盖太多的R标题 - 所以最简单的(?)路径可能是将数据提供给R,也许是通过Rserve(通过tcp / ip''松散'连接)和RInside(通过嵌入更紧密的连接),并让R写它。
编辑:自编写原始答案以来的几年中,已创建了一个此类库:librdata。
答案 1 :(得分: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 ++代码是否可以在独立的库/可执行文件中运行。
NB :最初我错过了解决方案应该独立于R
的评论,但是对于那些正在搜索完全相同的问题的人,但他们可以依赖于{ {1}},这可能会有所帮助。
答案 2 :(得分: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";
}