如何使R语言中生成的嵌套函数固化参数值?
在R中生成包含具体参数值的函数(而非闭包引用)
你编写了一个生成函数的R代码:
function_1<- function(a,b){ function_2 <- function(x){ ;x[1]^a*x[2]^b } return(function_2) }
执行fu <- function_1(1,1)后,fu的函数体仍保留a和b的引用,而非替换为传入的具体数值。以下是解决方法,能生成函数体包含目标值的函数,适配solnl约束优化需求:
方法一:用substitute构造函数体
通过substitute将传入的a、b值直接替换到函数体中,再用as.function生成目标函数:
function_1 <- function(a, b) { # 构造替换后的函数体表达式 func_body <- substitute({ x[1]^a_val * x[2]^b_val }, list(a_val = a, b_val = b)) # 创建以x为参数的函数 function_2 <- as.function(list(x = , func_body)) return(function_2) }
测试验证:
fu <- function_1(1, 1) print(fu)
输出结果:
function (x) { x[1]^1 * x[2]^1 } <environment: 0x000001cc81774c38>
方法二:用bquote结合eval生成函数
bquote支持通过.()插入具体值,搭配eval直接生成带字面量的函数:
function_1 <- function(a, b) { # 构造包含具体值的函数表达式 func_expr <- bquote(function(x) { x[1]^.(a) * x[2]^.(b) }) # 执行表达式得到目标函数 eval(func_expr) }
测试后同样能得到函数体包含具体数值的结果。
原理说明
原代码生成的是闭包,函数体中的a、b是对外部函数环境变量的引用,而非字面量。上述两种方法在创建函数时,直接将a、b的具体值替换到函数体表达式中,生成的函数不再依赖外部环境变量,完全符合你的需求。
内容的提问来源于stack exchange,提问作者Tunay Sabri Yüksel
相关产品推荐
相关产品推荐

