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

使用MASS包qda()时S3 formula类方法调用异常求助

解决MASS包qda()使用管道时的方法识别问题

问题原因

使用dplyr管道%>%传递数据给MASS::qda()时,管道会自动把左侧数据集作为第一个参数传入qda(),但qda()的formula方法签名为qda(formula, data, ...)——第一个参数需要是公式,第二个才是数据集。管道的自动传参会导致qda()误将数据集识别为x参数,转而调用默认的qda.default()方法,触发各类错误:

  • 第一种调用中,数据集被当成x,公式被当成grouping,两者长度不匹配,报错nrow(x) and length(grouping) are different
  • 第二种调用中,数据集被当成x,但未传入grouping参数,报错argument "grouping" is missing

解决方案

方案1:直接调用(不使用管道)

这是最稳妥的方式,明确对应formula方法的参数位置:

library(MASS)
library(tibble)
set.seed(123) # 固定随机种子保证可复现
data = tibble(Outcome = c(rep("in", 30), rep("out", 80)),
              Pred1 = sample(30:80, 110, replace = T),
              Pred2 = sample(c(rep("up", 80), rep("down", 30))))

model.qda <- qda(Outcome ~ Pred1 + Pred2, data = data)

方案2:保留管道,明确指定参数

用.指代管道传递的数据集,明确将其传给data参数,避免管道自动覆盖第一个参数:

# 直接在管道中指定公式
model.qda <- data %>% 
  qda(formula = Outcome ~ Pred1 + Pred2, data = .)

# 先定义公式再传入的写法
myformula <- Outcome ~ Pred1 + Pred2
model.qda <- data %>% 
  qda(formula = myformula, data = .)

方案3:用with()包裹调用

通过with()让数据集作为上下文,qda()可直接识别公式中的变量,同时保留管道:

model.qda <- data %>% 
  with(qda(Outcome ~ Pred1 + Pred2))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 10:55:06