आर

2017-03-09 9 views
6

में आलसी मूल्यांकन को समझना मैं समझने की कोशिश कर रहा हूं कि आर में कितना आलसी मूल्यांकन है। क्या यह केवल फ़ंक्शन तर्कों के मूल्यांकन पर लागू होता है? क्योंकि मैं समझता हूं, उदा।आर

f <- function(x = x, y = x*2) { 
    c(x, y) 
} 

f(2) 
[1] 2 4 

लेकिन अन्य भाषाओं में, उदा। हास्केल, आलसी मूल्यांकन का मतलब है कि फ़ंक्शन कॉल का मूल्यांकन केवल तभी किया जाता है जब इसका वास्तव में उपयोग किया जाता है। तो मैं एक पल में चलाने के लिए कुछ इस तरह उम्मीद करेंगे:

g <- function(x) { 
    y <- sample(1:100000000) 
    return(x) 
} 

g(4) 

लेकिन यह स्पष्ट रूप से आते हैं, हालांकि परिणाम आदत हो नहीं है sample कॉल मूल्यांकन करता है।

क्या कोई यह बता सकता है कि यह कैसे काम करता है, या मुझे विस्तार से समझाया गया है कि दिशा में मुझे इंगित करें?

इसी प्रकार के प्रश्न:

Question with similar wording, but different problem

उत्तर

7

आप पहले से ही पता चला है के रूप में, आर सामान्य अर्थ में आलसी मूल्यांकन का उपयोग नहीं करता।

> system.time(y <- sample(1E8)) 
    user system elapsed 
    7.636 0.128 7.766 
> system.time(length(y)) 
    user system elapsed 
     0  0  0 
system.time(delayedAssign("x", sample(1E8))) 
    user system elapsed 
    0.000 0.000 0.001 
> system.time(length(x)) 
    user system elapsed 
    7.680 0.096 7.777 

आप देख सकते हैं, y तुरंत मूल्यांकन किया जाता है, तो यह निर्धारित करने के y की लंबाई बिल्कुल भी समय नहीं लेता है: यदि आप इसे के रूप में नीचे दिखाया गया है की जरूरत है, समारोह delayedAssign() द्वारा लेकिन आर करता है, कि सुविधा प्रदान करता है। x दूसरी तरफ, इसका मूल्यांकन नहीं किया जाता है, इसे x का मूल्यांकन करने का केवल एक वचन delayedAssign() द्वारा वापस किया जाता है, और केवल तभी जब हमें वास्तव में x का मान चाहिए, इस मामले में इसकी लंबाई निर्धारित करने के लिए, x का मूल्यांकन किया जाता है।

इससे कोई फर्क नहीं पड़ता कि अभिव्यक्ति को किसी फ़ंक्शन में रखा गया है या वैश्विक वातावरण में निष्पादित किया गया है, इसलिए आपके उदाहरण में आपके द्वारा किए गए फ़ंक्शन के भीतर अभिव्यक्ति का समावेशन, वास्तव में कुछ भी नहीं जोड़ता है, इसलिए मैंने बहिष्कृत किया यह। लेकिन अगर आप सुनिश्चित हो करना चाहते हैं, की कोशिश:

a.f <- function(z) { delayedAssign("x", sample(1E8)); return(z+1) } 
system.time(a.f(0)) 
    user system elapsed 
     0  0  0 
+0

मैं हैडली विकहैम की किताब है, जहां वह उल्लेख है की चर्चा करते हुए हूँ: "डिफ़ॉल्ट रूप से, आर समारोह तर्क आलसी हैं, वे केवल, मूल्यांकन किया जाता है, तो वास्तव में इस्तेमाल किया"। क्या यह नवीनतम संस्करणों के साथ सच नहीं है? – Sarang

+0

ध्यान दें कि प्रश्न में यह वाक्यांश शामिल है "क्या यह केवल फ़ंक्शन तर्कों के मूल्यांकन पर लागू होता है?" मेरा जवाब विकम के बयान का खंडन नहीं करता है। –