2012-06-08 14 views
5

Supongamos que tengo un programa C++ que tiene un vector de objetos que quiero escribir en un archivo data.frame de Rdata, una observación por elemento del vector. ¿Cómo puedo hacer eso? Aquí hay un ejemplo. Supongamos que tengoescribir un archivo Rdata de C++

vector<Student> myStudents; 

Y Student es una clase que tiene dos miembros de datos, name que es de tipo std::string y grade que es de tipo int.

¿Mi única opción es escribir un archivo csv?

Tenga en cuenta que Rdata es un formato binario, así que supongo que necesitaría usar una biblioteca.

La búsqueda de Rdata [r] [C++] salió vacía.

+0

¿Puede proporcionar un breve ejemplo del formato de archivo requerido? – mathematician1975

+0

@ mathematician1975 seguro, pero es un formato binario (actualización de la publicación para mencionar esto). ¿Un ejemplo aún ayudaría? –

+3

Creo que es mucho mejor usar R API y escribir una extensión de C++ a largo plazo. Ver http://cran.r-project.org/doc/manuals/R-exts.html –

Respuesta

4

Creo que nadie se ha molestado en extraer un escritor archivo binario de las fuentes R para ser utilizado independientemente de R.

Hace casi veinte años hice lo mismo para los archivos de octava como su formato es simple: dos enteros de 'n' y 'k', seguidos por 'n * k' de datos, por lo que podría leer/escribir con dos llamadas a funciones cada una.

Me temo que para R tendrías que cubrir demasiados encabezados de R, por lo que la ruta más fácil (?) Podría ser dar los datos a R, quizás a través de Rserve (conexión 'suelta' sobre tcp/ip) y RInside (conexión más estrecha mediante incrustación), y haga que R lo escriba.

+0

OK gracias Dirk –

0

No sé si esto va a encajar todo el mundo necesita (de los que se googlear esta pregunta), pero de esta manera puedo guardar variables individuales o múltiples:

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" 

No estoy 100% seguro de que este código C++ funcionará en una biblioteca independiente/ejecutable.

NB: Inicialmente se perdió el comentario de que la solución debe ser independiente de R, pero para aquellos que está buscando exactamente la misma pregunta, pero están bien con dependencia de R, esto podría ser útil.

Cuestiones relacionadas