如何将表达式的变量作为曲线(curve())的方程传递?

9

I've the following code:

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

我想使用R的符号导数函数D来绘制一阶导数的图形:

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

但是我接着收到了下面的错误提示:
Error in curve(expression(e), xname = "x", from = 0, to = 3000) : 
     'expr' must be a function, or a call or an expression containing 'x'

我尝试使用eval()来包装D(e),但却毫无作用。
再试一点:
substitute(expression(x^2+3*x-3), list(x=3))

结果,如预期,会导致:

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

但是:

 substitute(e, list(x=3))

结果是:

 e

这是什么情况?我该如何让它正常工作?
2个回答

7

这有点笨重,但是

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

看起来能够工作。同样的道理,

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

1
或者等价地,eval(call("curve", D(e, "x"), from=0, to=1),这种语法可能更易于人类解析。 - Josh O'Brien
啊哈,现在我更好地理解了substitute和expression的行为。而且我最喜欢@Ben Bolker的第一种解决方案,因为它在概念上至少更容易书写:eval(substitute(curve(y, from=0, to=10), list(y=D(e,"x")))) - Nanitous
1
@Ben Bolker:我对一个可行的解决方案感到满意,但我仍然不太理解它。curve() 明确发出错误消息,指出第一个参数必须是表达式,而 e 是包含表达式的变量,其中包含一个 x。 R 如何看到包含表达式的变量?在某种程度上,R 似乎以不同的方式处理传递的参数。 - Nanitous

4

函数更容易操作和测试:

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接