आपने इस उदाहरण विधि में दूसरे तर्क के वर्ग के रूप में "अभिव्यक्ति" निर्दिष्ट की है। पहला उदाहरण, एक त्रुटि देता है क्योंकि
NewVar=Petal.Width*Petal.Length
मूल्य
Petal.Width*Petal.Length
कि मौका नहीं मिलता है मूल्यांकन किया जाना साथ पीछे करने के लिए एक नामित तर्क के रूप में व्याख्या की जा रही है क्योंकि NewVar कोई तर्क नहीं है इस विधि या सामान्य के लिए।
दूसरे उदाहरण में, मुझे यकीन है कि क्या बंद घुंघराले ब्रेसिज़ के साथ चल रहा है नहीं कर रहा हूँ के रूप में मेरी त्रुटि से पता चला एक से अलग है: मूल्यांकन करने में त्रुटि: पीछे में
त्रुटि (आईरिस, { फंक्शन 'myfun' के लिए एक विधि का चयन करने में तर्क 'y': त्रुटि: ऑब्जेक्ट 'Petal.Width' नहीं मिला
हालांकि, मुझे कोई त्रुटि नहीं मिलती है और आईरिस डेटा प्राप्त होता है जब मैं आपकी अभिव्यक्ति को मजबूर करता हूं एक अभिव्यक्ति वस्तु:
myfun(iris, expression(NewVar=Petal.Width*Petal.Length))
मुझे लगता है कि यह केवल आंशिक रूप से आपके प्रश्न का उत्तर देता है, क्योंकि आईरिस डेटा को लौटाने से पहले। फ्रेम वह नहीं था जो आप चाहते थे। अभिव्यक्ति का मूल्यांकन() द्वारा उचित रूप से मूल्यांकन नहीं किया जा रहा है। मुझे लगता है आप आउटपुट निम्नलिखित हार्ड-कोडेड संस्करण से वास्तव में उत्पादन का मिलान करना चाहते:
transform(iris, NewVar=Petal.Width*Petal.Length)
यहाँ एक छोटी उदाहरण eval का उपयोग कर अभिव्यक्ति का मूल्यांकन है
z <- expression(NewVar = Petal.Width*Petal.Length)
test <- eval(z, iris)
head(test, 2)
[1] 0.28 0.28
यहां एक संस्करण है जो डेटा पर एक चर कॉलम जोड़ने के लिए काम करता है।फ्रेम:
setGeneric('myfun',function(x,y)standardGeneric('myfun'))
setMethod('myfun',c('data.frame','expression'), function(x,y){
etext <- paste("transform(x, ", names(y), "=", as.character(y), ")", sep="")
eval(parse(text=etext))
})
## now try it.
test <- myfun(iris, expression(NewVar=Petal.Width*Petal.Length))
names(test)
[1] "Sepal.Length" "Sepal.Width" "Petal.Length" "Petal.Width" "प्रजाति" "NewVar"
head(test)
Sepal.Length Sepal.Width Petal.Length Petal.Width Species NewVar
1 5.1 3.5 1.4 0.2 setosa 0.28
2 4.9 3.0 1.4 0.2 setosa 0.28
फिर, यह कार्यान्वयन है अनिवार्य रूप से हार्ड कोडित किया गया है कि एक, और केवल एक, परिवर्तनीय कॉलम इनपुट डेटा.फ्रेम में जोड़ा जाएगा, हालांकि उस चर कॉलम का नाम और अभिव्यक्ति मनमानी है, और अभिव्यक्ति के रूप में प्रदान की जाती है। मुझे यकीन है कि एक बेहतर, अधिक सामान्य उत्तर है जो वाई में आयोजित अभिव्यक्ति का मूल्यांकन करेगा जैसे कि यह ट्रांसफॉर्म() फ़ंक्शन में प्रत्यक्ष कॉल था, लेकिन मैं इस समय फंस गया हूं कि उपयुक्त "उलटा" "अभिव्यक्ति के लिए समारोह()।
वहाँ हमेशा मानक है ..., यदि आप नहीं करते हैं वास्तव में y पर प्रेषण करने के लिए करना चाहते हैं:
setGeneric('myfun', function(x, ...) standardGeneric('myfun'))
setMethod('myfun', 'data.frame', function(x, ...){
transform(x, ...)
})
और यह महान काम करता है। लेकिन आपका प्रश्न वास्तव में एक अभिव्यक्ति वस्तु पर प्रेषण के बारे में था।
निम्नलिखित काम नहीं करता है, लेकिन मुझे लगता है कि यह करीब हो रहा है। शायद किसी में कूद और कुछ अंतिम तोड़ मरोड़ कर सकते हैं:
setGeneric('myfun', function(x, y) standardGeneric('myfun'))
setMethod('myfun',c('data.frame', 'expression'), function(x, y){
transform(x, eval(y, x, parent.frame()))
})
## try out the new method
z <- expression(NewVar = Petal.Width*Petal.Length)
test <- myfun(iris, z)
names(test)
[1] "Sepal.Length" "Sepal.Width" "Petal.Length" "Petal.Width" "प्रजाति"
अनिवार्य रूप से, अभिव्यक्ति का "नयाव =" टुकड़ा ट्रांसफॉर्म() को पारित नहीं किया गया था जब हमने myfun() को बुलाया था।
अधिक परीक्षण और त्रुटि के बाद, मैंने एक ऐसा तरीका निकाला जो वास्तविक के लिए काम करता है। सबसे पहले as.list() के साथ एक सूची में अभिव्यक्ति वस्तु कनवर्ट करते हैं, तो कॉल है कि आप अद्भुत
do.call()
पूर्ण उदाहरण के साथ चाहते हैं का निर्माण इस तरह दिखता है:
setGeneric('myfun', function(x, y) standardGeneric('myfun'))
setMethod('myfun',c('data.frame', 'expression'), function(x, y){
do.call("transform", c(list(x), as.list(y)))
})
# try out the new method
z <- expression(NewVar = Petal.Width*Petal.Length)
test <- myfun(iris, z)
names(test)
[1] "Sepal.Length" "Sepal.Width" "Petal.Length" "Petal.Width" "Species"
[6] "NewVar"
और नई data.frame ऑब्जेक्ट "टेस्ट" में "न्यूवायर" कॉलम है जो हम चाहते थे।
एसएफडीए के पीजी 39 9-402 देखें जहां चैंबर बताते हैं कि किसी भी हस्ताक्षर-परीक्षण तर्क _must_ का मूल्यांकन क्यों किया जाए। –
@DWin: एक लिंक साझा करने की देखभाल? एसएफडीए मुझे अपरिचित लगता है, और मुझे लगता है कि आप राज्य खाद्य और औषधि प्रशासन के बारे में बात नहीं कर रहे हैं ... –
क्षमा करें। जॉन चेम्बर्स द्वारा "डेटा विश्लेषण के लिए सॉफ्टवेयर"। एक अतिरिक्त बिंदु के रूप में मैंने देखा कि आपके हस्ताक्षर मूल्य तर्क नामों से जुड़े नहीं थे, जबकि प्रारूप में उदाहरण हैं। (ध्यान दें: आपने अभी तक प्रश्न निकाय में 'ट्रांसफॉर्म' में नहीं बदला है।) –