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

