基于R-4.1.2的lm函数自定义函数时遇object not found报错求解
解决R中自定义lm函数权重传递报错的问题
问题原因
lm()函数的weights参数会在传入的data数据框的环境中求值,而你的自定义函数里v是局部参数,不在data的环境范围内,因此触发了"object not found"错误。
解决方法
方法1:将权重向量临时加入数据框
在调用lm()前,把计算好的权重向量添加到data的局部副本中,再通过列名引用权重:
my_fun <- function(formula, data, v) { data$weight_col <- 1/v lm(formula, data, weights = weight_col) } my_fun(dist ~ speed, cars, rep(1, 50))
函数内的data是原数据的局部副本,修改不会影响外部的原数据框。
方法2:用do.call()指定权重的求值环境
通过do.call()构造lm调用,让weights在函数的局部环境中查找变量:
my_fun <- function(formula, data, v) { w <- 1/v do.call("lm", list(formula = formula, data = data, weights = quote(w))) } my_fun(dist ~ speed, cars, rep(1, 50))
quote()保留w的符号形式,确保do.call()在当前函数环境中寻找该变量,而非data环境。
方法3:手动指定model.frame的环境
直接调用model.frame()并指定求值环境为当前函数环境,再传给lm():
my_fun <- function(formula, data, v) { mf <- model.frame(formula, data, weights = 1/v, env = environment()) lm(formula, data = mf) } my_fun(dist ~ speed, cars, rep(1, 50))
env = environment()强制model.frame()在函数局部环境中解析weights参数,从而找到v变量。
内容的提问来源于stack exchange,提问作者Deku
相关产品推荐
相关产品推荐

