for循环执行代码而不会遇到错误

时间:2018-11-23 11:40:07

标签: r

我有很多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

1 个答案:

答案 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]])
}