2011-04-18 25 views
6

मैं एक आर पैकेज है कि वर्तमान में सी में मैट्रिसेस manipulates लिख रहा हूँ, मैट्रिक्स आर को लौट स्थापित करने पंक्ति/स्तंभ नाम के लिए संख्या है। मैं नहीं बल्कि जब सीआर विस्तार, मैट्रिक्स पंक्ति/स्तंभ नाम

मैं चारों ओर एक घंटे के लिए googled है में वस्तु को संशोधित करने के अपने ही पंक्ति/स्तंभ नाम आवंटित है, लेकिन अभी तक एक अच्छा समाधान नहीं मिली है। मैंने पाया सबसे नज़दीकी आयाम है, लेकिन मैं केवल दो आयामों के बजाय प्रत्येक कॉलम का नाम देना चाहता हूं। मैट्रिस 4x4 से बड़ा हो जाता है, नीचे मैं जो करना चाहता हूं उसका एक छोटा सा उदाहरण है।

पंक्तियों की संख्या 4^x जहाँ X पंक्ति नाम

Current 
    [,1] [,2] [,3] [,4] 
[1,] 0.20 0.00 0.00 0.80 
[2,] 0.25 0.25 0.25 0.25 
[3,] 0.25 0.25 0.25 0.25 
[4,] 1.00 0.00 0.00 0.00 
[5,] 0.20 0.00 0.00 0.80 
[6,] 0.25 0.25 0.25 0.25 
[7,] 0.25 0.25 0.25 0.25 
[8,] 1.00 0.00 0.00 0.00 
[9,] 0.20 0.00 0.00 0.80 
[10,] 0.25 0.25 0.25 0.25 
[11,] 0.25 0.25 0.25 0.25 
[12,] 1.00 0.00 0.00 0.00 
[13,] 0.20 0.00 0.00 0.80 
[14,] 0.25 0.25 0.25 0.25 
[15,] 0.25 0.25 0.25 0.25 
[16,] 1.00 0.00 0.00 0.00 

Desired 
    [A] [C] [G] [T] 
[AA] 0.20 0.00 0.00 0.80 
[AC] 0.25 0.25 0.25 0.25 
[AG] 0.25 0.25 0.25 0.25 
[AT] 1.00 0.00 0.00 0.00 
[CA] 0.20 0.00 0.00 0.80 
[CC] 0.25 0.25 0.25 0.25 
[CG] 0.25 0.25 0.25 0.25 
[CT] 1.00 0.00 0.00 0.00 
[GA] 0.20 0.00 0.00 0.80 
[GC] 0.25 0.25 0.25 0.25 
[GG] 0.25 0.25 0.25 0.25 
[GT] 1.00 0.00 0.00 0.00 
[TA] 0.20 0.00 0.00 0.80 
[TC] 0.25 0.25 0.25 0.25 
[TG] 0.25 0.25 0.25 0.25 
[TT] 1.00 0.00 0.00 0.00 
+0

dimnames प्रत्येक पंक्ति और कॉलम का नाम देते हैं, जो एक कर्सर नज़र में? Dimnames dimnames (mat) <- list (c ("ए", "सी", "जी", "टी"), सी (" ए ',' सी ', "जी", "टी")) वहाँ भी है? rownames और? – mdsumner

उत्तर

3

के रूप में जिम ने कहा, यह बहुत आर में करने के लिए मैं nam के माध्यम से सी समारोह में नाम गुजर रहा हूँ आसान है तर्क।

#include <Rinternals.h> 
SEXP myMat(SEXP nam) { 
    /*PrintValue(nam);*/ 
    SEXP ans, dimnames; 
    PROTECT(ans = allocMatrix(REALSXP, length(nam), length(nam))); 
    PROTECT(dimnames = allocVector(VECSXP, 2)); 
    SET_VECTOR_ELT(dimnames, 0, nam); 
    SET_VECTOR_ELT(dimnames, 1, nam); 
    setAttrib(ans, R_DimNamesSymbol, dimnames); 
    UNPROTECT(2); 
    return(ans); 
} 

आप myMat.c नामक एक फाइल में है कि कोड डाल, तो आप इसे नीचे लाइन के माध्यम से परीक्षण कर सकते हैं। मैं Ubuntu का उपयोग कर रहा है, तो आप myMat.dll को myMat.so बदलने के लिए यदि आप Windows पर हैं होगा।

R CMD SHLIB myMat.c 
Rscript -e 'dyn.load("myMat.so"); .Call("myMat", c("A","C","G","T"))' 
+0

हम्म, ठीक है, समस्या एसईएक्सपी ऑब्जेक्ट्स में स्ट्रिंग प्राप्त कर रही है। सुरक्षा (colnames = allocVector (VECSXP, 4)); \t सुरक्षा (ए = NEW_CHARACTER (1)); SET_STRING_ELT (ए, 0, एमकेएचएआर ("ए")); SET_VECTOR_ELT (राउनम्स, 0, ए); SET_VECTOR_ELT (राउनम्स, 1, ए); SET_VECTOR_ELT (राउनम्स, 2, ए); SET_VECTOR_ELT (राउनम्स, 3, ए); – Nick

+0

क्या आपका मतलब है कि myMat.so "myMat.dll" को "बदलें" कहना है? फिलहाल, जिस तरह से यह पढ़ता है ऐसा लगता है कि आप 'myMat.cll' में बदलने के लिए 'myMat.c'' का जिक्र कर रहे हैं। –

+0

@ गैविन: आप सही हैं; संपादित। –

1

टिप्पणी ऊपर की लंबाई है शिक्षाप्रद है। dimnames डाटासेट है, जहां प्रत्येक तत्व यह है कि आयाम में नंबर तत्वों से मेल खाती है, जैसे कि, list(c('a','c','g','t'), c('a','c','g','t')) के आयाम के रूप में तत्वों की एक ही नंबर के साथ एक सूची है।

सी में सेट करने के लिए है कि, मैं सिफारिश करेंगे:

PROTECT(dimnames = allocVector(VECSXP, 2)); 
PROTECT(rownames = allocVector(STRSXP, 4)); 
PROTECT(colnames = allocVector(STRSXP, 4)); 
setAttrib(? , R_DimNamesSymbol, dimnames); 

फिर आप प्रासंगिक rowname और colname तत्वों सेट करना होगा। सामान्य तौर पर, इस चीज है ज्यादा आसान आर

जिम में क्या करना

+0

आप 'setAttrib' कॉल करने से पहले' dimnames' के तत्वों निर्धारित करने की आवश्यकता colnames। @Nick: मैं भी आर –

+0

जिम में ऐसा करने की सलाह देते हैं, यह (4) के साथ-साथ असुरक्षित होने की जरूरत होगी। मैंने कोशिश की और यह काम नहीं लग रहा था। मैं कोशिश कर रहा हूं हालांकि – Nick

+0

आपको कम से कम निम्नलिखित की आवश्यकता होगी, लेकिन यह अभी भी काम नहीं कर रहा है ...SET_STRING_ELT (राउनम्स, 0, एमकेएचएचआर ("ए")); SET_VECTOR_ELT (dimnames, 0, rownames); SET_VECTOR_ELT (dimnames, 1, उपनाम); – Nick

6

आप सी के लिए खुले हैं, तो C++ के बजाय, तो Rcpp इस थोड़ा आसान बना सकते हैं। हम सिर्फ हम आर में होगा के रूप में पंक्तियों और स्तंभ नाम के साथ एक सूची वस्तु बनाने, और मैट्रिक्स वस्तु के dimnames विशेषता है कि आवंटित:

R> library(inline)       # to compile, link, load the code here 
R> src <- ' 
+ Rcpp::NumericMatrix x(2,2); 
+ x.fill(42);       // or more interesting values 
+ // C++0x can assign a set of values to a vector, but we use older standard 
+ Rcpp::CharacterVector rows(2); rows[0] = "aa"; rows[1] = "bb"; 
+ Rcpp::CharacterVector cols(2); cols[0] = "AA"; cols[1] = "BB"; 
+ // now create an object "dimnms" as a list with rows and cols 
+ Rcpp::List dimnms = Rcpp::List::create(rows, cols); 
+ // and assign it 
+ x.attr("dimnames") = dimnms; 
+ return(x); 
+ ' 
R> fun <- cxxfunction(signature(), body=src, plugin="Rcpp") 
R> fun() 
    AA BB 
aa 42 42 
bb 42 42 
R> 

स्तंभ और पंक्ति के नाम की वास्तविक काम तो मैनुअल है .. क्योंकि वर्तमान सी ++ मानक प्रारंभ में वैक्टरों के प्रत्यक्ष असाइनमेंट की अनुमति नहीं देता है, लेकिन यह बदल जाएगा।

संपादित करें: मैं सिर्फ एहसास हुआ कि मैं निश्चित रूप से पंक्ति पर उपयोग कर सकते हैं स्थिर create() विधि और भी colnames है, जो इस थोड़ा आसान और कम करता है अभी भी

R> src <- ' 
+ Rcpp::NumericMatrix x(2,2); 
+ x.fill(42);       // or more interesting values 
+ Rcpp::List dimnms =     // two vec. with static names 
+  Rcpp::List::create(Rcpp::CharacterVector::create("cc", "dd"), 
+       Rcpp::CharacterVector::create("ee", "ff")); 
+ // and assign it 
+ x.attr("dimnames") = dimnms; 
+ return(x); 
+ ' 
R> fun <- cxxfunction(signature(), body=src, plugin="Rcpp") 
R> fun() 
    ee ff 
cc 42 42 
dd 42 42 
R> 

तो हम तीन या करने के लिए नीचे कर रहे हैं चार बयान, सुरक्षा/अप्रत्यक्ष और कोई स्मृति प्रबंधन के साथ कोई बंदरगाह नहीं।

+0

सुझाव के लिए धन्यवाद, लेकिन दुर्भाग्यवश मैं सी – Nick

+0

तक सीमित नहीं हूं क्योंकि वास्तव में हर आर इंस्टॉलेशन जिसमें सीसीसी के माध्यम से सी ++ है, उसके पास ++ के माध्यम से सी ++ है, और ऑब्जेक्ट कोड इंटरऑपरेट करता है। –

+0

क्या '.attr (" rownames ")', '.attr (" colnames ")', '.attr (" names ") 'है, अगर कोई केवल कॉलम या पंक्ति नाम निर्दिष्ट करना चाहता है? दस्तावेज़ों में इस जानकारी को कहां मिलेगा? – highBandWidth

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