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

在R语言中运行prcomp函数时遭遇‘object of type 'closure' is not subsettable’错误的技术求助

问题分析与解决方案

首先,你遇到的'object of type 'closure' is not subsettable'错误,直接原因是调用prcomp函数时用了方括号[]而非圆括号()。方括号[]是R中用来子集化数据框、向量这类对象的语法,而prcomp是一个函数,调用函数必须用圆括号()来传递参数。

1. 修正PCA调用代码

把你最后一行的错误代码:

pca <- prcomp[data = pca_train, center=FALSE, scale=FALSE]

改成:

pca <- prcomp(pca_train, center=FALSE, scale.=FALSE)

或者用更清晰的命名参数写法:

pca <- prcomp(x = pca_train, center = FALSE, scale. = FALSE)

注意:prcomp里的缩放参数是scale.(带点),不是scale;不过你已经提前标准化了数据,所以设置center=FALSE和scale.=FALSE是正确的。

2. 补充测试集的标准化(重要!)

你只对训练集做了标准化,但测试集的特征必须使用训练集的均值和标准差来标准化,不能直接用测试集自己的统计量,否则会引入数据泄露,导致PCA和后续模型的结果偏差。

这里提供一个更严谨的标准化方案:

# 提取训练集特征列
train_features <- leaf_train[, 2:15]
# 记录训练集的均值和标准差(后续给测试集用)
train_means <- colMeans(train_features)
train_sds <- apply(train_features, 2, sd)

# 训练集标准化
leaf_train_standard <- leaf_train
leaf_train_standard[, 2:15] <- scale(train_features, center = train_means, scale = train_sds)

# 测试集用训练集的统计量标准化
leaf_test_standard <- leaf_test
leaf_test_standard[, 2:15] <- scale(leaf_test[, 2:15], center = train_means, scale = train_sds)

# 准备PCA输入
pca_train <- leaf_train_standard[, 2:15]
pca_test <- leaf_test_standard[, 2:15]

# 正确执行PCA
set.seed(1000)
pca <- prcomp(pca_train, center = FALSE, scale. = FALSE)

3. 额外小检查

  • 可以用head(training_set)确认stratified_labels返回的ID_unit是合理的行索引;
  • 你已经将leaf_data$Species转为因子,这一步没问题,符合分类任务的要求。

这样修改后,你的PCA代码就能正常运行,同时也解决了测试集标准化的潜在问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 11:12:29