R:mclappy可以工作,但在使用pbmclappy时函数失败

R:mclappy可以工作,但在使用pbmclappy时函数失败,r,function,progress-bar,lapply,mclapply,R,Function,Progress Bar,Lapply,Mclapply,虽然我不是专家,但我了解大多数事情,但我遇到了一个我不太了解的情况。我正在编写一个函数,通过包装Seurat函数Read10X,简化读取R包Seurat数据文件的过程。我写的函数是: Read10X_Multi_lapply <- function( base_path, secondary_path = NULL, default_10X = TRUE, lib_list = NULL, lib_names = NULL, parallel = FALSE,

虽然我不是专家,但我了解大多数事情,但我遇到了一个我不太了解的情况。我正在编写一个函数,通过包装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), function(x) {
      file_path <- file.path(base_path, lib_list[x], secondary_path)
      raw_data <- Read10X(data.dir = file_path, ...)
    })
  }
  # 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)
}
但是,当我插入
pbmclappy
(在上面的原始函数中)以获得函数的进度条,然后运行相同的代码时,函数失败。具体来说,当进度条前进并似乎正在读取文件时(与
mclappy
version的时间相同),由于某种原因,它无法实际返回矩阵列表,并且当尝试命名值为NULL的列表时,函数失败

如果我通过从目标文件路径中删除目录来减少正在测试的输入的数量,从而只有
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)