使用BGData包chunkedApply函数报错:dimnames[2]长度与数组范围不匹配
BGData::chunkedApply 使用 identity 函数报错的原因与解决方法
报错原因
当使用 chunkedApply 并设置 MARGIN = 1L(按行处理)时,函数默认会尝试将 FUN 的输出简化为矩阵/数组格式。identity 函数返回的是每行的原始向量,而 chunkedApply 内部会自动为结果添加维度名,但分块处理时,维度名的长度与实际结果的维度不匹配,从而触发 dimnames(x) <- dn : length of 'dimnames' [2] not equal to array extent 错误。
而改用 length 函数时,它返回的是单个数值,不会触发维度名匹配逻辑,因此代码可以正常运行。
解决方法
有两种可行的解决方式:
方法1:设置 simplify = FALSE
通过指定 simplify = FALSE,强制 chunkedApply 返回列表格式,避免自动简化为矩阵,这样 identity 函数的输出可以正常保留:
library(BGData) library(parallel) subset <- Merged_Data[1:50, 1:50] n <- 4L index <- splitIndices(nrow(subset), n) for (k in seq_len(n)) { chunk <- chunkedApply(subset, MARGIN = 1L, FUN = identity, i = index[[k]], simplify = FALSE) print(length(chunk)) }
方法2:包装 identity 为返回列表的函数
将 identity 包装在一个返回列表的函数中,让输出以列表形式返回,绕过维度名匹配逻辑:
library(BGData) library(parallel) subset <- Merged_Data[1:50, 1:50] n <- 4L index <- splitIndices(nrow(subset), n) for (k in seq_len(n)) { chunk <- chunkedApply(subset, MARGIN = 1L, FUN = function(x) list(identity(x)), i = index[[k]]) print(length(chunk)) }
内容的提问来源于stack exchange,提问作者Qba Liu
相关产品推荐
相关产品推荐

