2010-02-22 6 views
5

मेरा सवाल यह है कि आर में किसी अन्य फ़ंक्शन में फ़ंक्शन से किसी चर के नाम को निकालने का तरीका कैसे है?एक फ़ंक्शन में एक चर के नाम को कैसे निकाला जाता है जिसे आर में किसी अन्य फ़ंक्शन से बुलाया जाता है?

a <- function(variable) { 

    print(deparse(substitute(variable))) 

    internala(substitute(variable)) 

} 

internala <- function(variableXX) { 

    namex=deparse(substitute(variableXX)) 

    print(namex) 
} 

समारोह a निम्नलिखित परिणाम देता है कॉलिंग:

समझाने के लिए, यहाँ एक उदाहरण है

>a(whatever) 

[1] "whatever" 

[1] "substitute(variable)" 

जिसका मतलब है कि मैं a से चर whatever के नाम निकाल सकते हैं, लेकिन internala से नहीं।

इस पर कोई विचार?

किसी भी मदद की सराहना की जाएगी!

मारिया

+0

बस स्पष्ट होने के लिए, आप क्या व्यवहार चाहते हैं? मुझे लगता है कि आप 'एक (जो कुछ भी' प्रिंट करना चाहते हैं, जो भी दो बार प्रिंट करें? यदि आप 'internala (जो कुछ भी) निष्पादित करते हैं, तो क्या आप भी आउटपुट चाहते हैं 'जो भी' हो? क्या होगा यदि आप foo <- function (b) {a (b)} को कॉल करते हैं; foo (बार)? –

+0

हां, आपने सही ढंग से अनुमान लगाया है, मैं चाहता हूं कि (जो कुछ भी दो बार प्रिंट करें, इंटर्नला (जो कुछ भी) प्रिंट करने के लिए और जहां मैं वास्तव में अटक गया, वही है जो आपने इंगित किया है, यह है कि अगर मेरे पास कोई अन्य फ़ंक्शन है foo <- function (बी) {ए (बी)}, मुझे दो बार प्रिंट करने के लिए foo (bar) चाहिए। क्या यह स्पष्ट है? क्या आपको यह जानने का कोई विचार है कि यह कैसे करें? बहुत कुछ टीएनएक्स! मारिया – Maria

+0

अंतिम मामले के आधार पर, ऐसा लगता है कि आप अभिव्यक्ति को शीर्ष स्तर पर कॉल करने के लिए सभी तरह से विस्तार करना चाहते हैं, लेकिन आगे नहीं? ताकि अगर foo2 <- function (b) {foo (b + 1)} भी थे, तो आप foo2 (बार) बार बार 1 बार प्रिंट करने के लिए चाहते हैं? –

उत्तर

3

आप a समारोह को बदल सकता है एक internala समारोह के तर्क और eval विकल्प यह है नहीं हूँ ' नाम। मैं आमतौर पर ऐसा कुछ करता हूं:

a <- function(variable, vname=deparse(substitute(variable))) { 
    print(vname) 
    internala(variable, vname) 
} 

internala <- function(variableXX, namex=deparse(substitute(variableXX))) { 
    print(namex) 
} 

a(whatever) 

प्रत्येक फ़ंक्शन नाम पारित किए बिना कॉल किया जा सकता है, लेकिन आप इसे ओवरराइड कर सकते हैं। उदाहरण के लिए:

a(whatever, "othername") 
1

यहाँ कुछ है कि मेरे लिए काम करता है।

a <- function(variable) { 
    print(deparse(substitute(variable))) 
    eval(substitute(internala(variable))) # this is only change 
} 

internala <- function(variableXX) { 
    namex=deparse(substitute(variableXX)) 
    print(namex) 
} 

a(whatever) 

हैडली पता चलता है कि इसके बेहतर सीधे पारित करने के लिए: हालांकि मुझे यकीन है कि अगर यह इष्टतम समाधान

a <- function(variable) { 
print(deparse(substitute(variable))) 
my_command <- paste('internala(',substitute(variable),')',sep = '') 
eval(parse(text = my_command)) 
} 

internala <- function(variableXX) { 
namex=deparse(substitute(variableXX)) 
print(namex) 
} 
+0

उपरोक्त क्योंकि यह दो मामूली quibbles को छोड़कर चाल करता है: 1.) आपको विकल्प को अलग करना चाहिए, अन्यथा यदि आप एक (बी + 1) कहते हैं तो आपको एक त्रुटि मिल जाएगी। 2.) मारिया की टिप्पणियों के आधार पर आपको पैरेंट फ्रेम भी जाना होगा। –

6

आप स्थानापन्न और दोस्तों के साथ चारों ओर खिलवाड़ नहीं से बेहतर कर रहे हैं - आप एक समारोह है कि के खिलाफ कार्यक्रम के लिए बहुत मुश्किल हो जाएगा बनाने की संभावना है। एक स्ट्रिंग के रूप में स्पष्ट रूप से चर के नाम पर क्यों न हो?

+0

निश्चित रूप से; स्ट्रिंग नामों के साथ काम करना अधिक सीधे आगे है। – Shane

+0

यह सहायक था (धन्यवाद), लेकिन फ़ंक्शन के अंदर मुझे फिर 'var <- get (var_as_string)' करना था। – drstevok

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

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