2012-08-15 8 views
20

में एक vectorized समारोह को परिभाषित करने, मैं सिर्फ समारोह में एक पाश का उपयोग करके पता है कि कैसे आरकैसे शीर्षक के रूप में आर

  • में एक vectorized समारोह को परिभाषित करने के है यह चाहते हैं?
  • क्या यह विधि कुशल है?
  • और सबसे अच्छा अभ्यास क्या है?

उत्तर

24

आर स्तर पर एक लूप वेक्टरकृत नहीं है। एक आर लूप एक वेक्टर के प्रत्येक तत्व के लिए एक ही आर कोड बुलाएगा, जो अक्षम होगा। वेक्टरिज्ड फ़ंक्शंस आमतौर पर उन लोगों को संदर्भित करते हैं जो एक वेक्टर लेते हैं और पूरे वेक्टर पर एक कुशल तरीके से काम करते हैं। आखिरकार इसमें कुछ लूप के लिए शामिल होगा, लेकिन चूंकि उस लूप को निम्न-स्तर की भाषा में सी किया जा रहा है जैसे कि सी यह अत्यधिक कुशल और विशेष कार्य के अनुरूप हो सकता है।

दो वैक्टर

sillyplus <- function(x, y) { 
    out <- numeric(length = length(x)) 
    for(i in seq_along(x)) { 
     out[i] <- x[i] + y[i] 
    } 
    out 
} 

के तत्वों जोड़ो में जोड़ने के लिए इस मूर्खतापूर्ण समारोह पर विचार करें यह सही परिणाम

R> sillyplus(1:10, 1:10) 
[1] 2 4 6 8 10 12 14 16 18 20 

देता है और इस अर्थ में कि यह पूरे वैक्टर पर एक ही बार में काम कर सकते हैं में vectorised है , लेकिन यह ऊपर वर्णित अर्थ में वेक्टरिज्ड नहीं है क्योंकि यह असाधारण रूप से अक्षम है। + आर में सी स्तर पर वेक्टरिज्ड है, इसलिए हमें वास्तव में केवल 1:10 + 1:10 की आवश्यकता है, आर

वेक्टरिज्ड फ़ंक्शन लिखने का सामान्य तरीका मौजूदा आर कार्यों का उपयोग करना है जो पहले से ही वेक्टरिज्ड हैं। यदि आप स्क्रैच से शुरू करना चाहते हैं और जिस चीज को आप फ़ंक्शन के साथ करना चाहते हैं वह आर (विषम, लेकिन संभव) में वेक्टरिज्ड फ़ंक्शन के रूप में मौजूद नहीं है, तो आपको अपने हाथों को गंदे करने और फ़ंक्शन की गड़बड़ी लिखने की आवश्यकता होगी सी और उस सी कार्य को कॉल करने के लिए आर में थोड़ा रैपर तैयार करें जिसे आपने उस डेटा के वेक्टर के साथ लिखा था जिसे आप काम करना चाहते हैं। ऐसे कार्यों के लिए Vectorize() जैसे कार्यों के तरीके हैं जो वेक्टर किए गए आर कार्यों के लिए नकली वेक्टरिसेशन के लिए हैं।

सी यहाँ ही एकमात्र विकल्प नहीं है, FORTRAN एक संभावना के रूप सी ++ और, एक प्रकार की कटार Eddelbuettel & रोमेन फ्रेंकोइस करने के लिए धन्यवाद, बाद rcpp पैकेज के साथ अब क्या करना बहुत आसान है।

7

एक सदिशित कार्य उसी तर्क के एक वेक्टर को अपने तर्कों में से एक के रूप में वापस कर देगा। आम तौर पर "+", cos या exp जैसे अंतर्निर्मित कार्यों के संयोजनों का उपयोग करके ऐसा कोई फ़ंक्शन प्राप्त कर सकता है जो वेक्टरकृत भी हैं।

vecexpcos <- function(x) exp(cos(x)) 
vecexpcos((1:10)*pi) 
> vecexpcos((1:10)*pi) 
# [1] 0.3678794 2.7182818 0.3678794 2.7182818 0.3678794 2.7182818 0.3678794 2.7182818 0.3678794 2.7182818 

आप sum की तरह एक गैर vectorized समारोह उपयोग करने की आवश्यकता है, तो आपको वांछित व्यवहार प्राप्त करने के लिए mapply या Vectorize आह्वान करने के लिए आवश्यकता हो सकती है।

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