2011-12-08 17 views
7

मैं बस कुछ अजीब में भाग गया, जो उम्मीद है कि यहां कोई व्यक्ति कुछ प्रकाश डाल सकता है। असल में, जब किसी फ़ंक्शन में कोई तर्क होता है जिसका डिफ़ॉल्ट मान तर्क का नाम होता है, तो अजीब चीजें होती हैं (ठीक है, वैसे भी मेरे लिए अजीब)।तर्क के साथ अप्रत्याशित व्यवहार डिफ़ॉल्ट

उदाहरण के लिए

:

y <- 5 

f <- function(x=y) x^2 

f2 <- function(y=y) y^2 

मैं विचार करेगा f और f2 बराबर हो; हालांकि वे आंतरिक रूप से विभिन्न चर नामों का उपयोग करते हैं, फिर भी उन्हें डिफ़ॉल्ट वातावरण के रूप में उपयोग करने के लिए वैश्विक वातावरण में y ऑब्जेक्ट चुनना चाहिए। हालांकि:

> f() 
[1] 25 

> f2() 
Error in y^2 : 'y' is missing 

यह सुनिश्चित नहीं है कि यह क्यों हो रहा है।

बस चीजों को और भी अधिक दिलचस्प बनाने के:

f3 <- function(y=y) y$foo 

> f3() 
Error in f3() : 
    promise already under evaluation: recursive default argument reference or earlier problems? 

मैं f3 की उम्मीद एक त्रुटि फेंक, लेकिन नहीं है कि एक!

यह 32-बिट विंडोज एक्सपी एसपी 3 पर आर 2.11.1, 2.12.2, और 2.14 पर परीक्षण किया गया था। केवल मानक संकुल लोड हो गए।

+0

अंततः आप कोड करने के लिए 'f2 <चाहता था - समारोह (y = पर्यावरण (F2) $ y) वाई^2' और 'f3 <- फ़ंक्शन (y = पर्यावरण (f3) $ y) y $ foo' – jogo

उत्तर

1

फ़ंक्शन के दायरे में डिफ़ॉल्ट तर्कों का मूल्यांकन किया जाता है। आपका f2 निम्नलिखित कोड के समान (लगभग बराबर) है:

f2 = function(y) { 
    if (missing(y)) y = y 
    y^2 
} 

यह देखते हुए साफ करता है और बताता है कि क्यों अपने कोड काम नहीं करता।

ध्यान दें कि यह केवल डिफ़ॉल्ट तर्कों के लिए सत्य है; स्पष्ट रूप से पारित तर्क (बेशक) कॉलर के दायरे में मूल्यांकन किया जाता है।

आलसी मूल्यांकन, दूसरे हाथ पर, इस के साथ कोई संबंध नहीं है: सभी तर्क lazily मूल्यांकन किया जाता है, लेकिन बिना किसी शिकायत के f2(y) काम करता है बुला। पता चलता है कि आलसी मूल्यांकन हमेशा होता है, इस पर विचार करें:

f3 = function (x) { 
    message("x has not been evaluated yet") 
    x 
} 

f3(message("NOW x has been evaluated") 

यह इस क्रम में प्रिंट होगा,:

x has not been evaluated yet 
NOW x has been evaluated 
संबंधित मुद्दे