2012-06-08 37 views
5

C++ Giả sử tôi có một chương trình C++ có một vector của các đối tượng mà tôi muốn viết ra một rdata data.frame tập tin, một quan sát cho mỗi phần tử của vector. Làm thế nào tôi có thể làm điều đó? Đây là một ví dụ. Giả sử tôi cóviết một tập tin rdata từ

vector<Student> myStudents; 

Student là một lớp trong đó có hai thành viên dữ liệu, name đó là loại std::stringgrade đó là loại int.

là lựa chọn duy nhất của tôi để viết một tập tin csv?

Lưu ý rằng rdata là một định dạng nhị phân vì vậy tôi đoán tôi sẽ cần phải sử dụng một thư viện.

Một tìm kiếm cho rdata [r] [C++] đã đưa ra sản phẩm nào.

+0

bạn có thể cung cấp một ví dụ ngắn gọn về các định dạng tập tin cần thiết? – mathematician1975

+0

@ mathematician1975 chắc chắn nhưng nó là một định dạng nhị phân (cập nhật bài đề cập đến điều này). Một ví dụ có giúp ích gì không? –

+3

Tôi nghĩ bạn nên sử dụng R API tốt hơn và viết một phần mở rộng C++ trong một thời gian dài. Xem http://cran.r-project.org/doc/manuals/R-exts.html –

Trả lời

4

Tôi nghĩ ai đã làm phiền để trích xuất một nhà văn tập tin nhị phân từ các nguồn R được sử dụng độc lập từ R.

Gần hai mươi năm trước, tôi đã làm tương tự cho các tập tin Octave như là định dạng của họ chỉ đơn giản là: hai số nguyên cho 'n' và 'k', theo sau là 'n * k' dữ liệu - vì vậy bạn có thể đọc/ghi với hai cuộc gọi hàm.

Tôi lo ngại rằng đối với R, bạn sẽ phải bao gồm quá nhiều tiêu đề R - vì vậy tuyến đường dễ nhất (?) Có thể cung cấp dữ liệu cho R, có thể thông qua kết nối Rserve ('lỏng lẻo' trên tcp/ip) và RInside (kết nối chặt chẽ hơn bằng cách nhúng), và R viết nó.

+0

OK cảm ơn bạn Dirk –

0

Tôi không biết nếu điều này sẽ phù hợp với tất cả mọi người cần (của những người được googling câu hỏi này), nhưng cách này bạn có thể lưu biến cá nhân hay nhiều:

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" 

Tôi không Chắc chắn 100% nếu mã C++ này sẽ hoạt động trong thư viện độc lập/thực thi.

NB: Ban đầu tôi đã bỏ lỡ những nhận xét rằng giải pháp phải độc lập với R, nhưng đối với những người đang tìm kiếm chính xác cùng một câu hỏi, nhưng họ là ok với sự phụ thuộc vào R, đây có thể hữu ích.

Các vấn đề liên quan