You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 19:17:06