2017-12-20 45 views
7

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

square <- function(x) { return(x^2) } 

मैं एक समारोह के भीतर इस समारोह कॉल करना चाहते हैं, और मैं भी अपने नाम प्रदर्शित करने के लिए जब मैं ऐसा करना चाहता हूँ। मैं deparse(substitute()) का उपयोग कर ऐसा कर सकता हूं। हालांकि, निम्नलिखित उदाहरणों पर विचार करें:

ds1 <- function(x) { 
    print(deparse(substitute(x))) 
} 

ds1(square) 
# [1] "square" 

यह अपेक्षित आउटपुट है, इसलिए सब ठीक है। हालांकि, अगर मैं समारोह एक सूची में लिपटे गुजरती हैं और पाश के लिए एक का उपयोग कर इसे संसाधित, निम्न होता है:

ds2 <- function(x) { 
    for (y in x) { 
    print(deparse(substitute(y))) 
    } 
} 

ds2(c(square)) 
# [1] "function (x) " "{"    " return(x^2)" "}" 

किसी को भी इस क्यों होता है मेरे लिए व्याख्या कर सकते हैं और कैसे मैं से होने से रोक सकता है?

उत्तर

7

जैसे ही आप अपने कार्य के अंदर x का उपयोग करते हैं, इसका मूल्यांकन किया जाता है, इसलिए यह "एक (अनियमित) अभिव्यक्ति होने से रोकता है" और "इसके परिणामी मान (मूल्यांकन अभिव्यक्ति) होने लगते हैं"। इसे रोकने के लिए, आपको पहली बार इसका उपयोग करने से पहले द्वारा x पर कब्जा करना होगा।

substitute का परिणाम एक ऐसा ऑब्जेक्ट है जिसे आप क्वेरी कर सकते हैं जैसे कि यह एक सूची थी।

ds2 <- function(x) { 
    x <- substitute(x) 
    # you can do `x[[1]]` but you can't use the expression object x in a 
    # for loop. So you have to turn it into a list first 
    for (y in as.list(x)[-1]) { 
     print(deparse(y)) 
    } 
} 
ds2(c(square,sum)) 
## [1] "square" 
## [1] "sum" 
+1

कमाल है, धन्यवाद: तो आप

x <- substitute(x) 

और फिर x[[1]] (समारोह नाम) और x[[2]] और निम्न (समारोह के तर्कों)

तो यह काम करता है का उपयोग कर सकते हैं। जाहिर है, इसके लिए तकनीकी शब्द 'वादा वस्तु' है। जबकि 'x' एक वादा है, इसके तत्व (जब' y' को सौंपा गया है) अब वादे नहीं कर रहे हैं और इसलिए 'विकल्प' एक अलग मूल्य देता है। –

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