从C ++写一个Rdata文件

时间:2012-06-08 18:21:51

标签: c++ r

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

vector<Student> myStudents;

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

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

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

搜索Rdata [r] [C ++]时出现空白。

3 个答案:

答案 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";
}