簡體   English   中英

通過公式作為函數參數

[英]pass formula as function parameter

以下是從某個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 

為了使函數調用更簡潔,是否可以重寫腳本來實現以下目的,即擺脫“ function(q)”部分?

MAX_FN_XY(q-2*q^2)

謝謝!

您可以執行類似的操作,但是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 

您應該知道,使用parse使我感到不安,而我並不是唯一的一個。 我認為關於答案是否解析的公理是您在問錯誤的問題。

您可以按以下方式將表達式(使用“ q”作為變量)傳遞給過程(請參閱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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM