R:mclappy可以工作,但在使用pbmclappy时函数失败
虽然我不是专家,但我了解大多数事情,但我遇到了一个我不太了解的情况。我正在编写一个函数,通过包装Seurat函数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,
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)