我有很多r代码,如下所示。
sce_1$use <- cellFilter(sce_1, 2500, 1000, 5)
sce_2$use <- cellFilter(sce_2, 2500, 1000, 5)
sce_3$use <- cellFilter(sce_3, 2500, 1000, 5)
sce_4$use <- cellFilter(sce_4, 3000, 1000, 5)
sce_5$use <- cellFilter(sce_5, 3000, 1000, 5)
此代码可以正常工作,没有任何错误或警告。为了实现自动化和清理过程,我试图将其循环。
sce_list=mget(sce)
for (i in 1:length(paths))
sce_list[i]$use <- cellFilter(sce_list[i], 3000, 1000, 5)
The error I get
Quitting from lines 209-213 (prototype.Rmd)
Error in sce$total_features : $ operator is invalid for atomic vectors
Calls: <Anonymous> ... eval -> eval -> cellFilter -> filter_by_expr_features
Execution halted
我还尝试过的是:
sce_list=mget(sce)
for (i in 1:length(paths))
get(paste0("sce_",i))$use <- cellFilter(sce[i], 2500, 1000, 5)
the error I get is
Quitting from lines 209-213 (prototype.Rmd)
Error in sce$total_features : $ operator is invalid for atomic vectors
Calls: <Anonymous> ... eval -> eval -> cellFilter -> filter_by_expr_features
Execution halted
在评论中的一项建议中,我使用了:
sce_list=mget(sce)
for (i in 1:length(paths))
sce_list[[i]]$use <- cellFilter(sce_list[[i]], 2500, 1000, 5)
这很好。但是,使用前一部分并用于正常工作的下一个代码块不会循环前一个块。但是,现在抛出错误。
automateFiltering <- function(sce){
options(repr.plot.width=4, repr.plot.height=4)
plotPCA(
sce,
size_by = "total_features",
pca_data_input = "pdata",
shape_by = "use",
detect_outliers = TRUE,
return_SCE = TRUE
)
}
sce_1 <- automateFiltering(sce_1)
sce_2 <- automateFiltering(sce_2)
sce_3 <- automateFiltering(sce_3)
sce_4 <- automateFiltering(sce_4)
错误:
Quitting from lines 241-246 (prototype.Rmd)
Error in .choose_vis_values(object, shape_by, cell_control_default = TRUE, :
'use' not found in 'colnames(colData(x))'
Calls: <Anonymous> ... plotPCA -> .local -> plotReducedDim -> .choose_vis_values
Execution halted
答案 0 :(得分:1)
我不确定以下是答案,这个问题缺少示例数据集。
显然,mget
指令有效。
sce_list <- mget(sce)
然后,在调用use
所需的每个列表成员对象中创建一个变量automateFiltering
。并将automateFiltering
的返回值分配回相同列表成员对象。
这将破坏每个sce_list[[i]]
的先前内容。
for (i in seq_along(sce_list)){
sce_list[[i]]$use <- cellFilter(sce_list[[i]], 2500, 1000, 5)
sce_list[[i]] <- automateFiltering(sce_list[[i]])
}
如果要保留sce_list
,请将automateFiltering
的返回值分配给不同列表,我将其命名为sce_auto
。
sce_auto <- vector("list", length(sce_list))
for (i in seq_along(sce_list)){
sce_list[[i]]$use <- cellFilter(sce_list[[i]], 2500, 1000, 5)
sce_auto[[i]] <- automateFiltering(sce_list[[i]])
}