2013-10-17 9 views
7

Ich habe den folgenden Code:Wie übergibt man eine Variable eines Ausdrucks an curve() als ihre Gleichung?

e <- expression(x^2+3*x-3) 

Ich mag symbolische derivate Funktion D mit R der Handlung der ersten Ableitung zeichnen:

curve(D(e), from=0, to=10) 

Aber dann bekomme ich folgende Fehlermeldung:

Error in curve(expression(e), xname = "x", from = 0, to = 3000) : 
    'expr' must be a function, or a call or an expression containing 'x' 

Ich habe versucht, D (e) in einem Aufruf von eval() zu wickeln, aber ohne Erfolg.

Der Versuch, ein bisschen mehr:

substitute(expression(x^2+3*x-3), list(x=3)) 

Ergebnisse, wie erwartet, in:

expression(3^2+3*3-3) 

Aber:

substitute(e, list(x=3)) 

Ergebnisse in:

e 

Was passiert? Wie kann ich das funktionieren lassen?

Antwort

5

Es ist ein wenig klobig, aber

eval(substitute(curve(y),list(y=D(e,"x")))) 

scheint zu funktionieren. Das Gleiche gilt für

do.call(curve,list(D(e,"x"))) 
+1

oder äquivalent 'eval (Aufruf ("Kurve", D (e, "x"), aus = 0, = 1) 'die Syntax verwendet, die (?) Menschlicher sein könnte, analysierbar –

+0

Aha, jetzt verstehe ich das Verhalten von Ersatz und Ausdruck besser.Und ich mag die erste Lösung von @Ben Bolker am besten, weil in dieser Form es einfacher ist um zumindest konzeptuell zu schreiben: 'eval (ersetzen (Kurve (y, von = 0, bis = 10), Liste (y = D (e," x ")))) – Nanitous

+0

@Ben Bolker: Ich bin bin glücklich mit einer funktionierenden Lösung, aber ich verstehe es immer noch nicht richtig. 'curve()' gibt eine Fehlermeldung aus sage explizit, dass das erste Argument ein Ausdruck sein muss und "e" eine Variable ist, die einen Ausdruck enthält, der ein "x" enthält. Wie sieht R eine Variable, die einen Ausdruck enthält? Es scheint mir, dass R behandelte Parameter in irgendeiner Weise anders behandelt. – Nanitous

3

Funktionen sind einfacher zu handhaben und zu testen:

e <- expression(x^2+3*x-3) 
de <- D(e, 'x') 
fde <- function(x) eval(de) 

curve(fde, from=0, to=10) 
Verwandte Themen