下面是一个函数,用于从一定的x范围返回给定公式的数值最大值。
一切都很好,如下所示。
MAX_FN_XY = function(Fn, x1 = 0, x2 = 100)
{
x = seq(x1, x2, by= 0.001)
i = which.max(Fn(x))
x_max = x[i]
y_max = Fn(x[i])
return (c("X*" = x_max,"Y*" = y_max))
}
MAX_FN_XY(function(q){q-2*q^2})Output :
X Y
0.250 0.125 为了使函数调用更加简洁,是否可以重写脚本以实现以下目的,即去掉“函数(Q)”部分?
MAX_FN_XY(q-2*q^2)谢谢!
发布于 2018-03-10 08:59:43
您可以这样做,但是Fn参数必须是引号。否则,R将试图评估它的现状(这是一件好事)。此外,引用的函数需要使用相同的变量名,这是嵌套函数的形式参数,您希望它是q,所以它是q)。
MAX_FN_XY <- function(Fn, x1 = 0, x2 = 100){
f <- function(q){
parse(text = Fn)
}
x= seq(0, 100, by = 0.1)
i = which.max(eval(f(x)))
x_max = x[i]
y_max = eval(f(x[i]))
return(c("X*" = x_max, "Y*" = y_max))
}
MAX_FN_XY(Fn = "q-2*q^2")
# X* Y*
# 0 -28 你应该知道,使用解析会让我不舒服,而且我不是唯一一个。我认为,如果答案是解析,你问错了问题,这是一个公理。
发布于 2018-03-11 09:53:06
您可以将一个表达式(使用"q“作为变量)传递给您的过程,如下所示(请参阅高级R中的文档):
MAX_FN_XY = function(expr, x1 = 0, x2 = 100) {
Fn = eval(call("function", as.pairlist(alist(q=)), substitute(expr)))
x = seq(x1, x2, by= 0.001)
i = which.max(Fn(x))
x_max = x[i]
y_max = Fn(x[i])
return (c("X*" = x_max,"Y*" = y_max))
}
MAX_FN_XY(q-2*q^2)
# X* 0.25
# Y* 0.125https://stackoverflow.com/questions/49206528
复制相似问题