R 中具有多个输入的函数中的一个输入的评估

Evaluation of one input in a function with multiple inputs in R

我正在尝试执行以下操作,但无法弄清楚。有人可以帮我吗?

f <- expression(x^3+4*y)
df <- D(f,'x')

x <-0
df0 <- eval(df)

df0 应该是 y 的函数!

如果你对 xf 的导数,你会得到 3 * x^2。就 x 而言,4*y 是一个常数。所以你没有 y 这样的函数,就 y 而言,你的 df 是一个常数(尽管它是 x 的函数)。

分配给 x 不会改变 df;它仍然是表达式 3 * x^2 并且仍然是 x 的函数,如果你想这样对待它的话。

如果您想替换表达式中的变量,那么 substitute() 就是您要找的。

> substitute(3 * x^2, list(x = 0))
3 * 0^2

这是一个没有简化表达式的盲目替代——我们可能在这里期望为零,但我们得到零乘以 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()改变了[=的值14=].

在 Tidyverse 中有更好的操作表达式的函数,但我不记得它们了。