【发布时间】:2022-01-10 07:56:06
【问题描述】:
我正在尝试执行以下操作,但无法弄清楚。有人可以帮帮我吗?
f <- expression(x^3+4*y)
df <- D(f,'x')
x <-0
df0 <- eval(df)
df0 应该是 y 的函数!
【问题讨论】:
标签: r function derivative
我正在尝试执行以下操作,但无法弄清楚。有人可以帮帮我吗?
f <- expression(x^3+4*y)
df <- D(f,'x')
x <-0
df0 <- eval(df)
df0 应该是 y 的函数!
【问题讨论】:
标签: r function derivative
如果你对f 求导,则得到x,你得到3 * x^2。就x 而言,4*y 是一个常数。所以你没有y的函数,你的df是y的常数(尽管它是x的函数)。
分配给x 不会改变df;它仍然是表达式 3 * x^2 并且仍然是 x 的函数,如果您想这样对待它。
如果您想替换表达式中的变量,那么 substitute() 就是您要查找的内容。
> substitute(3 * x^2, list(x = 0))
3 * 0^2
这是一个没有简化表达式的盲目替代——我们可能在这里预期为零,但我们得到 0 乘以 3——但这就是你得到的。
不幸的是,用你在变量中的表达式替换有点麻烦,因为substitute() 认为它的第一个参数是逐字表达式,所以你得到
> substitute(df, list(x = 0))
df
表达式是df,其中没有x,因此没有任何内容被替换,您只需返回df。
你可以通过两个替换和一个 eval 来解决这个问题:
> df0 <- eval(
+ substitute(substitute(expr, list(x = 0)),
+ list(expr = df)))
> df0
3 * 0^2
> eval(df0)
[1] 0
最外层的substitute() 将df 的值放入expr,因此您可以在那里得到正确的表达式,而内部的substitute() 会改变x 的值。
Tidyverse 中有更好的操作表达式的函数,但我不记得它们了。
【讨论】: