使用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
相关产品推荐
相关产品推荐

