R语言运行线性回归调用train()函数出现unexpected symbol报错问题
报错成因
- 函数括号未闭合:你写的
mealLm、meatPCR对应的train()、as.formula()调用均漏写右括号,R解析代码时会默认未闭合的语句未结束,自动将下一行代码拼接进当前语句,最终识别到无法解析的符号,抛出unexpected symbol错误。 - 参数归属错误:混淆了
caret::train()的两种调用逻辑,as.formula()仅接收公式表达式(如protein~.),你错误将train()的x、y、method等参数全部放入as.formula()的入参范围内,语法完全不符合规范。 - 变量引用错误:
mealLm定义中引用的test数据集、meatPLS定义中引用的x/y对象均未提前定义,trControl参数错误传入函数名trainControl而非你提前定义好的ctrl对象。
修复方案
首先明确caret::train()的两种合法调用方式:
- 公式接口:
train(因变量~自变量, data = 包含所有变量的数据框, 其他参数),适合输入统一整合为一个数据框的场景 - x/y接口:
train(x = 自变量矩阵/数据框, y = 因变量向量, 其他参数),不需要套as.formula(),适合自变量、因变量分开存储的场景
修正后的对应代码段如下:
ctrl <- trainControl(method = "repeatedcv", repeats = 5) set.seed(529) # 线性模型直接使用x/y接口调用 mealLm <- train(x = absorpTrain, y = proteinTrain, method = "lm", trControl = ctrl) set.seed(529) # PCR删除错误的as.formula嵌套,补全右括号 meatPCR <- train(x = absorpTrain, y = proteinTrain, method = "pcr", trControl = ctrl, tuneLength = 25) set.seed(529) # PLS替换为你实际定义的自变量、因变量对象 meatPLS <- train(x = absorpTrain, y = proteinTrain, method = "pls", trControl = ctrl, preProcess = c("center", "scale"), tuneLength = 25) comps <- rbind(meatPLS$results, meatPCR$results) comps$Model <- rep(c("PLS", "PCR"), each = 25)
另外你代码中混合了LaTeX图表语法(\caption、\end{figure}等),如果是在R脚本中运行需要删除这些非R代码片段,避免报错。
内容的提问来源于stack exchange,提问作者Cori R.
相关产品推荐
相关产品推荐

