[英]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.