2012-11-11 16 views
6

प्राप्त करना मैंने अभी आर सीखना शुरू किया, इस प्रकार छोटे दिखने वाले मुद्दों से फंस गया। मैं यह पता लगाने की कोशिश कर रहा हूं कि आर। ++ में मूल्यों का उत्पादन कैसे किया जाता है, हम बस रिटर्न वैरिएबल का उपयोग करते हैं, लेकिन ऐसा लगता है कि आर के साथ ऐसा नहीं लगता है। मेरे पास एक ऐसा फ़ंक्शन है जो 4 इनपुट तर्क लेता है, उन तर्कों को पास करता है सी ++ फ़ंक्शन जो आवश्यक गणना करता है, अब अगर मैं आर में यह myfun लोड करना चाहता हूं और C++ funciton से आउटपुट प्राप्त करना चाहता हूं, तो मुझे क्या करने की ज़रूरत है? निम्नलिखित टेम्पलेट का उपयोग करने का प्रयास कर रहा हूं।सी ++ और आर इंटरफ़ेस, आउटपुट

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); 

यहाँ // मैं एक सी ++ समारोह जो vector<vector<double> > someVal और vector<int> someVal2 की गणना करता है कहते हैं।

अब मैं उन मानों को दर और डीआईआर में पास करना चाहता हूं।

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

लेकिन संकलक इसे पसंद नहीं करता है। मुझे यकीन नहीं है कि इस मामले में p_rate और p_dir पॉइंटर्स का उपयोग कैसे करें।

इसके अलावा, मुझे समझ में नहीं आ रहा है कि निम्न कोड यह तरीका क्यों है। ऐसा लगता है कि सूची और नामों के लिए तार, दर और डीआईआर गुजर रहा है और दर और डीआईआर के मूल्य। हम बस क्यों नहीं कर सकते हैं और वांछित मूल्यों को मुद्रित नहीं कर सकते?

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); 
} 

मुझे आर में चर को वापस करने के पीछे मूल विचार नहीं मिल रहा है, यह बहुत भ्रमित लगता है। मैं वास्तव में सराहना करता हूं अगर कोई मुझे उन उचित संसाधनों को इंगित कर सकता है जो इन सामानों को बताते हैं।

अग्रिम में आपकी सहायता के लिए धन्यवाद!

उत्तर

9

यदि आप पहले से ही सी ++ से परिचित हैं, तो आप हमारे Rcpp परियोजना को निर्बाध आर और सी ++ इंटीग्रेशन उपयोगी के लिए पा सकते हैं। इसमें दस्तावेज और उदाहरणों के बहुत सारे शामिल हैं, साथ ही सीआरएएन के पास 80 से अधिक पैकेज हैं जो इसका उपयोग करते हैं जो उदाहरणों का एक और बड़ा कॉर्पस प्रदान करता है।

आप "परिचय" विग्नेट से शुरू कर सकते हैं जो हमारे JSS paper से मेल खाता है, और यहां [rcpp] टैग को भी देखें।

अन्यथा, आप आर एपीआई पर वापस आ गए हैं जो अधिक नंगे हड्डियों और सी पर आधारित है।

5

जैसा कि हमने आपके previous question का जवाब देते हुए कहा था, Rcpp एक शॉट दें, और अपने कोड में सभी क्लज को हटा दें।

#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 ; 

} 
संबंधित मुद्दे