Tôi mới bắt đầu học R, do đó bị kẹt với các vấn đề tìm kiếm tầm thường. Tôi đang cố gắng tìm ra cách các giá trị được xuất ra trong R. Trong C++, chúng ta đơn giản sử dụng biến trả về, nhưng điều đó dường như không đúng với R. Nói tôi có một hàm lấy 4 đối số đầu vào, chuyển các đối số đó đến C++ chức năng mà các tính toán cần thiết, bây giờ nếu tôi muốn tải myfun này trong R và nhận được đầu ra từ C++ funciton, tôi cần phải làm gì? Sau đây là mẫu tôi đang cố gắng sử dụng.Giao diện C++ và R, nhận đầu ra
extern "C" {
SEXP myfun(SEXP S, SEXP A, SEXP B, SEXP C) { //will call this function from R.
SEXP rate, dir, list, list_names; //declare variables
PROTECT(rate = allocMatrix(REALSXP, 10, 2)); //allocate 10x2 matrix of double type?
PROTECT(dir = allocVector(INTSXP, 10)); //allocated vector(10) of int type?
double* p_rate = REAL(rate); //why do I need pointers?
int* p_dir = INTEGER(dir);
// ở đây tôi gọi một ++ chức năng C này sẽ tính vector<vector<double> > someVal
và vector<int> someVal2
.
Bây giờ tôi muốn chuyển các giá trị đó đến tỷ lệ và dir.
for(int i =0; i < 10; i++){
rate[i][0] = someVal1[i][0];
rate[i][1] = someVal1[i][1];
dir[i] = someVal2[i];
}
nhưng trình biên dịch không thích nó. Tôi không chắc chắn làm thế nào để sử dụng các con trỏ p_rate và p_dir trong trường hợp này.
Ngoài ra, tôi không hiểu tại sao mã sau đây chính là cách thực hiện. Nó có vẻ là đi qua các chuỗi, tỷ lệ và dir đến list_names và các giá trị để tỷ lệ và dir. Tại sao chúng ta không thể đơn giản làm cout và in các giá trị mong muốn?
char *tag[2] = {"rate","dir"};
PROTECT(list_names = allocVector(STRSXP ,2));
SET_STRING_ELT(list_names, 0, mkChar(tag[0]));
SET_STRING_ELT(list_names, 1, mkChar(tag[1]));
PROTECT(list = allocVector(VECSXP ,2));
SET_VECTOR_ELT(list, 0, rate);
SET_VECTOR_ELT(list, 1, dir);
setAttrib(list, R_NamesSymbol , list_names);
UNPROTECT(8);
return (list);
}
Tôi không nhận được ý tưởng cơ bản đằng sau việc trả về biến trong R, có vẻ như rất khó hiểu. Tôi thực sự sẽ đánh giá cao nếu ai đó có thể chỉ cho tôi các nguồn tài nguyên thích hợp giải thích những thứ này.
Cảm ơn sự giúp đỡ của bạn trước!