下面是一个从某个x范围返回给定公式的数值max的函数
一切正常如下。
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)
谢谢!
答案 0 :(得分:0)
你可以这样做,但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
你应该知道使用解析让我感到不安,而我并不是唯一一个。我认为有一个公理,即如果答案是在解析你提出错误的问题。
答案 1 :(得分:0)
您可以将表达式(使用&#34; q&#34;作为变量)传递给您的过程,如下所示(请参阅Advanced 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.125