将公式作为函数参数传递

时间:2018-03-10 07:32:53

标签: r

下面是一个从某个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)

谢谢!

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