2012-05-13 21 views
6

मैं कुछ पेड़ों पर कुछ पार सत्यापन करने के लिए 'देखभाल' लाइब्रेरी का उपयोग कर रहा हूं।नाम के साथ पैरामीटर नाम

लाइब्रेरी train नामक एक फ़ंक्शन प्रदान करती है, जो नामित तर्क "विधि" लेती है। इसके इलिप्सिस के माध्यम से यह अन्य तर्कों को दूसरे कार्य के माध्यम से गिरने देना है जो इसे कॉल करता है। यह अन्य फ़ंक्शन (rpart) एक ही नाम, "विधि" का तर्क लेता है।

इसलिए मैं एक ही नाम के साथ दो तर्क पारित करना चाहता हूं ... और यह स्पष्ट रूप से विफल रहा है। मैंने नीचे दिखाए गए कार्यों के आसपास काम करने की कोशिश की लेकिन मुझे त्रुटि मिली:

"ट्रेन.डेफॉल्ट में त्रुटि (x = myx, y = myy, method =" rpart2 ", preProcess = NULL, औपचारिक तर्क" विधि

"कई वास्तविक बहस के अनुरूप" किसी भी मदद की बहुत सराहना कर रहा है! धन्यवाद!

train.wrapper = function(myx, myy, mytrControl, mytuneLenght, ...){ 
    result = train(
         x=myx, 
         y=myy, 
         method="rpart2", 
         preProcess=NULL, 
         ..., 
         weights=NULL, 
         metric="Accuracy", 
         trControl=mytrControl, 
         tuneLength=mytuneLenght 

        ) 
    return (result) 
} 
dtree.train.cv = train.wrapper(training.matrix[,2:1777], 
           training.matrix[,1], 
           2, method="class") 
+0

'मार्ग' तर्क के साथ 'ट्रेन' क्या करता है, इसे आरपीटी को पास करने के अलावा? –

+0

ट्रेन आंतरिक रूप से कॉल करने के लिए कौन सा फ़ंक्शन चुनने के लिए "इसकी" विधि तर्क का उपयोग करती है ... इसलिए ऊपर, ट्रेन आंतरिक रूप से "rpart" फ़ंक्शन को कॉल करेगी जिसमें इसकी "विधि" तर्क है और जिसे मैं प्राप्त करने की कोशिश कर रहा हूं ट्रेन के इलिप्सिस के माध्यम से गुजर रहा है। – Diego

उत्तर

7

यहां tr (ट्रेन) फ़ंक्शन के साथ आपकी समस्या का एक मॉक-अप है rp (rpart) फ़ंक्शन को कॉल करते हुए, ...:

rp <- function(method, ...) method 
tr <- function(method, ...) rp(...) 

# we want to pass 2 to rp: 
tr(method=1, method=2) # Error 
tr(1, method=2)  # 1, (wrong value!) 
tr(method=1, metho=2) # 2 (Yay!) 

यह क्या जादू है? और आखिरी मामला वास्तव में क्यों काम करता है ?! ठीक है, हम को समझने के लिए तर्क मिलान आर में काम करता है एक समारोह f <- function(foo, bar)औपचारिक पैरामीटर "foo" और "बार", और कॉल f(foo=3, ba=13) (वास्तविक) तर्क "foo" कहा जाता है के लिए कहा और किया जाता है की जरूरत है "बी ० ए"।

आर पहले उन सभी तर्कों से मेल खाता है जिनमें बिल्कुल औपचारिक पैरामीटर के समान नाम है। यही कारण है कि पहली "विधि" तर्क train पर पारित हो जाता है। दो समान तर्क नामों में त्रुटि होती है।

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

फिर अज्ञात तर्क शेष औपचारिक तर्कों के लिए स्थितित्मक क्रम में मेल खाते हैं।

अंत में, यदि औपचारिक तर्कों में ... शामिल है, तो शेष तर्क ... में डाल दिए गए हैं।

PHEW! इसलिए इस मामले में, tr पर कॉल method से पूरी तरह से मेल खाता है, और फिर बाकी को ... में पास करता है। tr पर rp पर कॉल करें, metho तर्क आंशिक रूप से इसके औपचारिक पैरामीटर method से मेल खाता है, और सब ठीक है!

... अभी भी, मैं train के लेखक से संपर्क करने का प्रयास करता हूं और इस समस्या को इंगित करता हूं ताकि वह इसे ठीक से ठीक कर सके! चूंकि "rpart" और "rpart2" समर्थित होना चाहिए, इसलिए उन्होंने इस उपयोग के मामले को याद किया होगा!

मुझे लगता है कि उसे method पैरामीटर का नाम method. या इसी तरह ("विधि" से अधिक कुछ भी) का नाम बदलना चाहिए। यह अभी भी पिछड़ा संगत होगा, लेकिन method पैरामीटर को सही ढंग से rpart पर पारित करने की अनुमति देता है।

+0

धन्यवाद @ टॉमी, यह महान है। इस पल से मुझे एहसास हुआ कि क्या हो रहा था मुझे पता था कि मुझे आर में तर्क मिलान के बारे में सीखना होगा ... मैं अपने प्रतिक्रिया चर को एक कारक के रूप में निर्दिष्ट करके इसे बाहर करने में सक्षम था, जिसके बदले में rpart को डिफ़ॉल्ट जिस विधि को मैं सेट करने की कोशिश कर रहा था। लेकिन आरटीपी के लिए प्रलेखन स्वयं कहता है "विधि को सीधे निर्दिष्ट करना सबसे बुद्धिमानी है, विशेष रूप से भविष्य में कार्य में अधिक मानदंड जोड़े जा सकते हैं।" तो मुझे अभी भी लगता है कि देखभाल के सुधार के लिए जगह है। मैंने इस पृष्ठ से जुड़े लेखक को ईमेल किया। यह पहला प्रश्न है जिसे मैं पोस्ट करता हूं और मदद से प्रभावित हूं! – Diego

+0

शैक्षिक रूप से चालाक। –

1

आम तौर पर रैपर नाम सूची में उनके पैरामीटर पास होगा। train के मामले में, नियंत्रण के लिए प्रावधान में पारित हो जाता है trControl तर्क। शायद आपको कोशिश करनी चाहिए:

dtree.train.cv = train.wrapper(training.matrix[,2:1777], 
          training.matrix[,1], 
       2, # will be positionally matched, probably to 'myTuneLenght' 
          myTrControl=list(method="class")) 

आपकी टिप्पणी के बाद मैंने train और rpart सहायता पृष्ठों की फिर से समीक्षा की। आप सोचने में सही हो सकते हैं कि trControl का एक अलग उद्देश्य है। मुझे संदेह है कि आपको rpart के बाद से फ़ॉर्मूला के साथ अपना कॉल बनाने की आवश्यकता हो सकती है, केवल एक सूत्र विधि है। यदि y तर्क विधि की तुलना में एक कारक है = "वर्ग rpart द्वारा मान लिया जाएगा और ... modelLookup चल रहा:।

modelLookup("rpart2") 
    model parameter   label seq forReg forClass probModel 
154 rpart2 maxdepth Max Tree Depth TRUE TRUE  TRUE  TRUE 

... मेरे लिए सुझाव है कि एक" वर्ग "विधि के रूप में डिफ़ॉल्ट रूप से मान लिया की जाएगी अच्छी तरह से। यदि आप आगे की सलाह चाहते हैं तो आपको डेटा उदाहरण (शायद rpart सहायता पृष्ठ से) में शामिल करने के लिए अपने प्रश्न को संपादित करने की आवश्यकता हो सकती है।

+0

मैं एक ट्रेन नियंत्रण ऑब्जेक्ट पास कर रहा हूं, और मुझे नहीं लगता कि यह वही करेगा जो आप सुझाव दे रहे हैं। ट्रेनिंग में प्रलेखन दस्तावेज का वर्णन करता है: "... \t वर्गीकरण या प्रतिगमन दिनचर्या में दिए गए तर्क" जबकि दस्तावेज के लिए दस्तावेज का उल्लेख तर्कों के माध्यम से पास नहीं होता है ... – Diego

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