2014-12-30 6 views
8

एक सहयोगी ने मुझसे यह पूछा, और मैंने इसके साथ संघर्ष किया है।एक समारोह के भीतर वक्र() को अभिव्यक्ति करने के लिए अभिव्यक्ति

मान लीजिए कि मैं एक फ़ंक्शन को परिभाषित करना चाहता हूं जो अभिव्यक्ति लेता है (मान लें कि x^2 कंक्रीटेंस के लिए) तर्क के रूप में और उस तर्क को curve() पर पास करता है।

यदि मैं यह आसान तरीका क्या करना चाहते हैं, मैं सिर्फ

curve(x^2,from=0,to=3) 

चलाने के लिए और यह ठीक काम करता है।

f <- function(g) { 
    curve(g,from=0,to=3) 
} 

यह काम करता है अगर मैं एक समारोह पारित:

मान लीजिए मैं एक आवरण समारोह सेट करने का प्रयास (मान लीजिए कि कुछ अन्य बातों की अवस्था की साजिश रचने के लिए मैं अलावा आवरण के अंदर क्या करना चाहते हैं):

f(function(x) x^2) 

यह विफल रहता है अगर मैं, जब आर अभिव्यक्ति का मूल्यांकन करने की कोशिश करता है x^2 पारित करने के लिए प्रयास करें:

f(x^2) 
## Error in eval(expr, envir, enclos) (from #2) : object 'x' not found 
मैं क्या इसके लायक है के लिए

f <- function(g) { 
    h <- as.expression(substitute(g)) 
    str(h) 
    curve(as.expression(substitute(g)),from=0,to=3) 
} 
f(x^2) 
## expression(x^2) 
## Error in curve(as.expression(substitute(g)), from = 0, to = 3) (from #4) : 
## 'expr' must be a function, or a call or an expression containing 'x' 

की कोशिश करनी चाहिए

f0 <- function(g) { 
    str(substitute(g)) 
    curve(substitute(g),from=0,to=3) 
} 
f0(x^2) 
## language x^2 
## Error in curve(substitute(g), from = 0, to = 3) (from #3) : 
## 'expr' must be a function, or a call or an expression containing 'x' 

ठीक है, कि शायद पता चलता है,

  • यह विफल:

    मैं समारोह के भीतर substitute का उपयोग करके इस को रोकने के लिए कोशिश कर सकते हैं अलग-अलग curve(h,...) ("फ़ंक्शन h नहीं मिला")

  • यह उसी तरह से विफल रहता है as.call()as.expression()
  • curve() दिया जाता है किसी भी मामले में भाव पर काम नहीं करता:

curve(expression(x^2),from=0,to=1) 
## Error in curve(expression(x^2), from = 0, to = 1) : 
## 'expr' did not evaluate to an object of length 'n' 

अगर मैं curve() डिबगिंग की कोशिश को देखने के लिए क्या हो रहा है, हमारे पास है:

sexpr <- substitute(expr) 
... 
if (!((is.call(sexpr) || is.expression(sexpr)) && xname %in% 
    all.vars(sexpr))) 
    stop(...) 

यहां sexprहै, जो xname %in% all.vars(sexpr) परीक्षण में विफल रहता है ...

इसे कैसे संभालना है इसके बारे में कोई विचार?

+1

क्या आपने एक शॉट 'do.call' दिया था? ऐसा लगता है जैसे यह 'एलएम',' ग्लम ', आदि –

उत्तर

6

मेरा मतलब नहीं था और जवाब देने का मतलब नहीं था, लेकिन मैंने (ए?) उत्तर को थोड़ा और अधिक पोकिंग के साथ निकाला - यह मेरे लिए हुआ कि मैंने अभी तक eval नहीं किया था। eval(curve(substitute(g),from=0,to=3))नहीं काम करता है, लेकिन यह करता है:

f1 <- function(g) { 
    eval(substitute(curve(g,from=0,to=3))) 
} 
f1(x^2) 

अद्यतन: @RichardScriven पता चलता है कि do.call() भी काम कर सकते हैं - और यह करता है!

f2 <- function(g) { 
    do.call(curve,list(substitute(g),from=0,to=3)) 
} 
f2(x^2) 

आगे की व्याख्या का स्वागत है!

+2

के साथ काम कर सकता है ऐसा लगता है कि यह कार्यक्षमता केवल इंटरैक्टिव (शीर्ष-स्तर) पर काम करने के लिए थी, इसलिए कामकाज को आपके जैसा सटीक कॉल बनाने की आवश्यकता है इंटरैक्टिव रूप से लिखते हैं, _then_ मूल्यांकन करें। – baptiste

+0

ठीक है, कम से कम आपने 'eval (parse (...))' tho 'का सुझाव नहीं दिया था, आप खतरनाक रूप से करीब आए थे :-)। मैं डब्ल्यू/रिचर्ड एस से सहमत हूं कि इस तरह के मामलों में 'do.call' आपका सबसे अच्छा दोस्त है। –

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