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 的函数!
如果你对 x
求 f
的导数,你会得到 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 中有更好的操作表达式的函数,但我不记得它们了。
我正在尝试执行以下操作,但无法弄清楚。有人可以帮我吗?
f <- expression(x^3+4*y)
df <- D(f,'x')
x <-0
df0 <- eval(df)
df0 应该是 y 的函数!
如果你对 x
求 f
的导数,你会得到 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 中有更好的操作表达式的函数,但我不记得它们了。