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

在R中调用boxcox函数时出现closure类型对象子集化错误

问题描述

我编写了一段简单的R代码:

library(MASS)
library(tidyverse)

df <- read_csv("https://raw.githubusercontent.com/stedy/Machine-Learning-with-R-datasets/master/insurance.csv")

b <- boxcox(lm(df$charges ~ 1))

运行时出现如下错误:

Error in df$charges : 类型为'closure'的对象不可子集化

单独调用lm(df$charges ~ 1)能正常运行,还可以用summary查看结果,但将其传入boxcox函数以选择lambda时却触发了该错误。

错误原因

问题出在lm的调用方式:当你直接用df$charges ~ 1作为公式时,lm只是把df$charges当成独立向量传入,没有将df关联为模型的数据源。而MASS::boxcox处理线性模型时,会重新解析公式并获取数据,此时它会在自身执行环境中查找df,但这个df被识别为base包中的df()密度函数(属于closure类型),而非你定义的数据框,因此触发错误。

解决方法

修改lm的调用方式,通过data参数指定数据源,让公式直接引用数据框的列名,这样boxcox就能正确识别数据:

library(MASS)
library(tidyverse)

df <- read_csv("https://raw.githubusercontent.com/stedy/Machine-Learning-with-R-datasets/master/insurance.csv")

# 指定data参数,公式使用列名而非直接引用向量
model <- lm(charges ~ 1, data = df)
b <- boxcox(model)

也可以直接在一行内完成:

b <- boxcox(lm(charges ~ 1, data = df))

这样修改后,lm会把df作为模型的数据源记录下来,boxcox处理时就能正确找到数据框df,不会和base包的df()函数混淆,从而正常执行lambda选择操作。

内容的提问来源于stack exchange,提问作者Norhther

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 23:25:17