2011-07-12 9 views
10

का उपयोग कर डेटा फ्रेम को से लेकर आर और सी पास करना क्या मनमाने ढंग से कॉलम (पूर्णांक/कारक, संख्यात्मक, वर्ण डेटा) के साथ डेटा फ्रेम को आर से सी और पीछे से पास करने का एक सामान्य तरीका है? पर्याप्त उदाहरणों को बंद करने के लिए पॉइंटर्स की सराहना की जाएगी।.call()

धन्यवाद।

आरटी

उत्तर

15

#include <Rdefines.h> 

SEXP df_fun(SEXP df) 
{ 
    int i, len = Rf_length(df); 
    SEXP result; 
    PROTECT(result = NEW_CHARACTER(len)); 
    for (i = 0; i < len; ++i) 
     switch(TYPEOF(VECTOR_ELT(df, i))) { 
     case INTSXP: 
      SET_STRING_ELT(result, i, mkChar("integer")); 
      break; 
     case REALSXP: 
      SET_STRING_ELT(result, i, mkChar("numeric")); 
      break; 
     default: 
      SET_STRING_ELT(result, i, mkChar("other")); 
      break; 
     }; 
     UNPROTECT(1); 
    return result; 
} 

की तर्ज पर और उसके बाद के बाद इतनी R CMD SHLIB df_fun.c

> dyn.load("df_fun.so") 
> df=data.frame(x=1:5, y=letters[1:5], z=pi, stringsAsFactors=FALSE) 
> .Call("df_fun", df) 
[1] "integer" "other" "numeric" 

GET_CLASS, GET_ATTR का उपयोग करें और डेटा फ्रेम के बारे में अन्य जानकारी खोजने के लिए Rdefines.h (या उनके समकक्ष कार्यों, जैसे getAttrib) में अन्य मैक्रोज़। ध्यान दें कि डेटा.फ्रेम में एक एपीआई है जो इसकी संरचना से भिन्न हो सकती है। तो उदाहरण के लिए आर फ़ंक्शन row.names पंक्ति.नाम विशेषता में संग्रहीत मान से कुछ अलग कर सकता है। मुझे लगता है कि अधिकांश .Call कार्य आर स्तर पर अधिक जटिल वस्तुओं के हेरफेर को बनाए रखते हुए परमाणु वैक्टर पर काम करते हैं।

+0

यह वही है जो मैं ढूंढ रहा था। धन्यवाद मार्टिन। डेटा फ्रेम (nrows, rownames, colnames, is.factor इत्यादि) के अन्य गुण क्या हैं? क्या मैं एक डीएफ पास करते समय क्वेरी कर सकता हूं और डीएफ लौटने पर सेट कर सकता हूं? आरटी – user151410

+0

मैंने उत्तर –

+0

उत्तर के अंत में इसके बारे में कुछ वाक्य जोड़े। यह सहायता करता है। आर टी – user151410

3

यहाँ एक प्रकार की कटार Eddelbeuttel द्वारा एक link to an example using C++ and package inline है: एक data.frame एक सूची है,

+0

त्वरित प्रतिक्रिया के लिए धन्यवाद। सी ++ एक विकल्प नहीं है क्योंकि मैं डिजाइन द्वारा सी तक सीमित हूं। – user151410

+0

शायद '[<-' ??? के लिए कोड देख रहे हैं ??? –

+0

सी पर प्रतिबंध क्यों? आर के लिए, आप जीसीसी का उपयोग करने के लिए बाध्य हैं जिसका मतलब है कि आप आसानी से जी ++ का उपयोग कर सकते हैं। आसान एपीआई हर बार कठिन एपीआई ट्रम्प। ओह, और डीडब्ल्यूएन द्वारा इंगित उदाहरण आसानी से डेटा लौटा सकता है। फ्रेम भी। –

0

डेटा.फ्रेम प्रकार "data.frame" विशेषता के साथ एक सूची है।

यह आर (src/पुस्तकालय/आँकड़े/src/model.c) के स्रोत में data.frame बनाने का उदाहरण है:

/* Turn the data "list" into a "data.frame" */ 
/* so that subsetting methods will work. */ 

PROTECT(tmp = mkString("data.frame")); 
setAttrib(data, R_ClassSymbol, tmp); 
UNPROTECT(1); 

आप अनुकरण कर सकते हैं data.frame मैन्युअल रूप से रास्ता:

l <- list(1:5) 
attr(l, "class") <- "data.frame" 
attr(l, "names") <- "Column 1" 
attr(l, "row.names") <- paste("Row ", 1:5) 
संबंधित मुद्दे