2012-11-12 19 views
6

मेरे पास एक लॉजिकल ऑपरेटर और एक संख्यात्मक मान है जो मैं एक समारोह में एक कथन के लिए एक तत्व के रूप में पास करना चाहता हूं (मैं सैकड़ों आर उपयोगकर्ताओं को चिल्ला रहा हूं; मैं ऐसा कभी नहीं करता लेकिन मुझे लगता है कि एक ऐसी स्थिति है यह ठीक है)।पास वर्ण तर्क और मूल्यांकन

as.numeric(rowSums(DF[, 1:6]) > 2) 

मैं जानता हूँ कि यह संभावना है eval और parse है, लेकिन उन्हें इस्तेमाल कभी नहीं तो वास्तव में समझ में नहीं आता कि कैसे उन्हें यहाँ का उपयोग करें:

DF <- mtcars 
overlap = "> 2" 
as.numeric(rowSums(DF[, 1:6]) overlap) 

मैं कैसे की तरह तीसरी लाइन का काम कर सकते हैं।

+0

क्या आप तुलना और दहलीज वाली सूची के रूप में ओवरलैप कर सकते हैं? – mnel

+0

@mnel नहीं क्योंकि ओवरलैप का मतलब और भी चीजें हो सकता है। यह चरित्र इनपुट होना चाहिए। –

उत्तर

7

कुछ की तरह

Olap <- unlist(strsplit(overlap, " ")) 
Thresh <- as.numeric(Olap[2]) 
Comp <- match.fun(Olap[1]) 
Comp(rowSums(DF[,1:6]), Thresh) 

एक वैकल्पिक eval है और पार्स के रूप में आप का सुझाव दिया

What <- rowSums(DF[,1:6]) 

textcall <- sprintf(" What %s", overlap) 

exprcall <- parse(text = textcall) 

eval(exprcall) 
+0

मुझे लगता है कि आपको 'असूची सूची' की आवश्यकता है लेकिन यह मेरा दृष्टिकोण हो सकता है। चलो देखते हैं कि थिंक टैंक क्या है। –

+0

धन्यवाद, मैं वास्तव में 'eval' 'parse' का उपयोग करने के तरीके में शुरुआत में रूचि रखता था और यह जानकारीपूर्ण रहा है लेकिन मुझे लगता है कि आपके द्वारा सुझाए गए पहले दृष्टिकोण बेहतर हो सकते हैं। +1 मैं लोगों को जवाब देने के लिए थोड़ा सा दे दूंगा लेकिन मेरे पास आपके पहले सुझाव का उपयोग करके पहले से ही फ़ंक्शन सेट अप किया गया है। –

+0

4 अपवॉट्स और कोई अन्य समाधान मुझे बताता है कि यह चेक मार्क है। मैंने पहले से ही जिथब में फ़ंक्शन अपलोड किया है। अच्छी तरह से काम करता है। आपके विचार के लिए धन्यवाद। –

7

आप एक स्ट्रिंग के लिए पूरे अभिव्यक्ति कन्वर्ट करने के लिए है, तो एक अभिव्यक्ति पर पार्स पाठ परिवर्तित। अंत में, अभिव्यक्ति पर eval() को कॉल करें।

जैसे:

overlap <- "> 2" 

# Convert to string 
exprAsString <- paste0("as.numeric(rowSums(DF[, 1:6]) ", overlap, ")") 

# Convert to expression, using parse 
expr <- as.expression(parse(text=exprAsString)) 

# Then call eval() 
eval(expr) 

अनुरुप यह काम करता है:

identical(eval(expr), as.numeric(rowSums(DF[, 1:6]) > 2)) 
# [1] TRUE 
1

यह मेरे हमलों है कि, जबकि @mnel के समाधान अच्छा है, यह एक ऐसी स्थिति है कि बनाने के द्वारा हल किया जा सकता है body(dummy_function) को संशोधित करने के लिए एक तर्क के रूप में आपके मुख्य फ़ंक्शन के अंदर एक डमी फ़ंक्शन और अपनी इनपुट स्ट्रिंग (overlap) का उपयोग करके। यह बहुत साफ हो सकता है।

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