2012-11-11 25 views
6

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> > someValvector<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!

Trả lời

9

Nếu bạn đã quen thuộc với C++, bạn có thể tìm thấy dự án Rcpp để tích hợp R và C++ liền mạch hữu ích. Nó chứa rất nhiều tài liệu và ví dụ, cộng với CRAN hiện có hơn 80 gói sử dụng nó cung cấp một tập hợp lớn các ví dụ khác.

Bạn có thể bắt đầu bằng họa tiết "Giới thiệu" tương ứng với số JSS paper của chúng tôi và cũng xem xét thẻ [rcpp] tại đây.

Nếu không, bạn quay lại API R có nhiều xương trần hơn và chỉ dựa trên C.

5

Như chúng tôi đã nói khi trả lời previous question của bạn, hãy cung cấp Rcpp một lần chụp và lấy tất cả kludge trong mã của bạn.

#include <Rcpp.h> 
using namespace Rcpp ; 

void yourCode(std::vector< std::vector<double> >& someVal, 
       std::vector<double>& someVal2){ ... } 

extern "C" SEXP myfun() { 
    NumericMatrix rate(10, 2); 
    NumericVector dir(10) ; 

    std::vector< std::vector<double> > someVal ; 
    std::vector<double> someVal2 ; 

    // call whatever function that fills someVal and someVal2 
    yourCode(someVal, someVal2) ; 

    // fills rate and dir 
    for(int i =0; i < 10; i++){ 
     rate(i, 0) = someVal1[i][0]; 
     rate(i, 1) = someVal1[i][1]; 
     dir[i] = someVal2[i]; 
    } 

    // structure the output 
    List result = List::create( 
     _["rate"] = rate, 
     _["dir"] = dir 
    ) ; 

    return result ; 

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