R语言函数传参返回及固定参数替换自变量生成新函数的方法
解决方法
方案1:base R实现,同时得到目标表达式+新函数
# 先定义固定参数的取值 Z <- c(1,2) y_fix <- 3 z_fix <- Z[2] # 构造3+3s的表达式,bquote会自动把.()内的内容求值后替换 target_expr <- bquote(s + .(y_fix) + s * .(z_fix)) # 如需自动简化为3 + 3s的形式,可加载Deriv包运行: # library(Deriv) # target_expr <- Simplify(target_expr) # 封装为仅依赖s的新函数 new_fun <- function(s) {} body(new_fun) <- target_expr
运行后验证效果:
> new_fun function (s) s + 3 + s * 2 > new_fun(5) # 测试调用,返回5+3+5*2=18 [1] 18
方案2:最简封装(不需要显式拿到表达式的场景)
直接用purrr::partial固定原函数的参数,再替换自变量名即可:
library(purrr) # 原函数 myfun <- function(x, y, z){ x + y + x*z} # 固定y、z的取值 myfun_fixed <- partial(myfun, y = 3, z = Z[2]) # 封装为仅依赖s的新函数 new_fun <- function(s) myfun_fixed(x = s)
之前写法的错误原因
- 第一种写法:
substitute默认不会对传入的参数表达式(比如Z[2])做求值,只会保留原始的调用形式,因此无法把Z[2]替换成实际值2。 - 第二种写法:
substitute(x)返回的是语言类对象,不能直接和数值做算术运算,因此触发非数值参数的报错。
内容的提问来源于stack exchange,提问作者nens
相关产品推荐
相关产品推荐

