R:mclapply 工作但使用 pbmclapply 时功能失败

问题描述

无论如何都不是 R 专家,但了解大多数事情,但我遇到了我不太了解的情况。我正在编写一个函数,通过包装在 Seurat 函数 Read10X 中来简化读取 R 包 Seurat 的数据文件的处理。我写的函数是这样的:

Read10X_Multi_lapply <- function(
  base_path,secondary_path = NULL,default_10X = TRUE,lib_list = NULL,lib_names = NULL,parallel = FALSE,num_cores = NULL,merge = FALSE,...
) {
  # Confirm num_cores specified
  if (parallel && is.null(x = num_cores)) {
    stop("If 'parallel = TRUE' then 'num_cores' must be specified.")
  }
  # Confirm directory exists
  if (dir.exists(paths = base_path) == FALSE) {
    stop(paste0("Directory: ",base_path,"specified by 'base_path' does not exist."))
  }
  # Detect libraries if lib_list is NULL
  if (is.null(x = lib_list)) {
    lib_list <- list.dirs(path = base_path,full.names = F,recursive = F)
  }
  # Add file path for 10X default directories
  if (default_10X && !is_null(x = secondary_path)) {
    stop("If 'default_10X = TRUE' then 'secondary_path' must be NULL.")
  }
  if (default_10X){
    secondary_path <- "outs/filtered_feature_bc_matrix/"
  }
  # Check if full directory path exists
  for (i in 1:length(x = lib_list)) {
    full_directory_path <- file.path(base_path,lib_list[i],secondary_path)
    if (dir.exists(paths = full_directory_path) == FALSE) {
      stop(paste0("Full Directory: ",full_directory_path," does not exist."))
    }
  }
  # read data
  if (parallel) {
    # *** Here is where the swap of mclapply or pbmclapply is occuring ***
    raw_data_list <- mclapply(mc.cores = num_cores,1:length(lib_list),function(x) {
      file_path <- file.path(base_path,lib_list[x],secondary_path)
      raw_data <- Read10X(data.dir = file_path,...)
      return(raw_data)
    })
  } else {
    raw_data_list <- pblapply(1:length(lib_list),...)
    })
  }
  # Name the list items
  if (is.null(lib_names)) {
    names(raw_data_list) <- lib_list
  } else {
    names(raw_data_list) <- lib_names
  }
  # Merge data
  if (merge) {
    raw_data_merged <- MergeSparseDataAll(matrix_list = raw_data_list,add_cell_ids = names(raw_data_list))
    return(raw_data_merged)
  }
  return(raw_data_list)
}

正如您所看到的,我创建了一个函数版本,其中包含使用并行包中的 mclapply 并行化进程的选项,以在读取大量文件时加快速度。在使用一组 14 个输入进行测试时(刚刚选择了输入数量,因为这是我手头的示例实验),它工作得很好,并在此处使用代码时按预期返回 14 个稀疏矩阵的列表:

multi_path <- "directory_path_here"
test <- Read10X_Multi_lapply(base_path = multi_path,secondary_path = "filtered_feature_bc_matrix/",default_10X = F,parallel = T,num_cores = 4,merge = F)

但是,当我换入 pbmclapply (在上面的原始函数中)以获得该函数的进度条,然后运行相同的代码时,该函数失败。具体来说,虽然进度条继续前进并似乎正在读取文件(与 mclapply 版本的时间相同),但由于某种原因,它实际上无法返回矩阵列表,并且该函数在尝试命名时失败值为 NULL 的列表。

如果我通过从目标文件路径中删除目录来减少我正在测试的输入数量,以便只有 pbmclapply 一起运行得很好,并返回6 个(或更少)稀疏矩阵的列表。

感觉我可能只是错过了一些基本方面,当 pbmclapply 工作正常时,mclapply 会导致此错误,并且似乎允许 pbmclapply 工作正常,具体取决于输入的数量。希望得到帮助/想法!

谢谢! 山姆

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)