diff --git a/R/zzz.R b/R/zzz.R index b2a8add754cdac41e188bf3a30030a64faf8fb21..d946ebf538f5986985acff7f7bc81961489cc870 100644 --- a/R/zzz.R +++ b/R/zzz.R @@ -1151,7 +1151,12 @@ remove_additional_na_from_merge <- function(data_array = NULL, merge_dim_metadat # When merge_across_dims = TRUE and split_multiselected_dims = TRUE, rearrange the chunks # (i.e., work_piece) is necessary if one file contains values for discrete dimensions -rebuild_array_merge_split <- function(data_array = NULL, metadata = NULL, indices_chunk, all_split_dims, final_dims_fake, across_inner_dim, length_inner_across_dim) { +rebuild_array_merge_split <- function(data_array = NULL, metadata = NULL, indices_chunk, + all_split_dims, final_dims_fake, across_inner_dim, length_inner_across_dim) { + + rebuild_data <- ifelse(is.null(data_array), FALSE, TRUE) + rebuild_metadata <- ifelse(is.null(metadata), FALSE, TRUE) + # generate the correct order list from indices_chunk final_order_list <- list() i <- 1 @@ -1183,88 +1188,91 @@ rebuild_array_merge_split <- function(data_array = NULL, metadata = NULL, indice new_dims <- c(new_dims, final_dims_fake[(split_dims_pos[length(split_dims_pos)] + 1):length(final_dims_fake)]) } - if (!is.null(data_array)) { - data_array_no_split <- array(data_array, dim = new_dims) + if (rebuild_data) { + data_array <- array(data_array, dim = new_dims) # seperate 'time' dim into each work_piece length - data_array_seperate <- list() - array_piece <- list() + data_array_seperate <- vector('list', length = length(length_inner_across_dim)) + array_piece <- vector('list', length = length(final_order_list)) } - if (!is.null(metadata)) { - metadata_no_split <- array(metadata, dim = new_dims) - metadata_seperate <- list() - metadata_piece <- list() + if (rebuild_metadata) { + metadata <- array(metadata, dim = length(metadata)) #metadata_no_split + names(dim(metadata)) <- across_inner_dim + metadata_seperate <- vector('list', length = length(length_inner_across_dim)) + metadata_piece <- vector('list', length = length(final_order_list)) } tmp <- cumsum(unlist(length_inner_across_dim)) tmp <- c(0, tmp) for (i in 1:length(length_inner_across_dim)) { - if (!is.null(data_array)) { - data_array_seperate[[i]] <- ClimProjDiags::Subset(data_array_no_split, + if (rebuild_data) { + data_array_seperate[[i]] <- ClimProjDiags::Subset(data_array, across_inner_dim, (tmp[i] + 1):tmp[i + 1]) } - if (!is.null(metadata)) { - metadata_seperate[[i]] <- ClimProjDiags::Subset(metadata_no_split, + if (rebuild_metadata) { + metadata_seperate[[i]] <- ClimProjDiags::Subset(metadata, across_inner_dim, (tmp[i] + 1):tmp[i + 1]) } } + # re-build the array: chunk which_chunk <- as.numeric(names(final_order_list)) sort_which_chunk <- sort(unique(which_chunk)) which_chunk <- sapply(lapply(which_chunk, '==', sort_which_chunk), which) - how_many_indices <- unlist(final_order_list) - if (!is.null(data_array)) { + if (rebuild_data) { ind_in_array_seperate <- as.list(rep(1, length(data_array_seperate))) - } else if (!is.null(metadata)) { + } else if (rebuild_metadata) { ind_in_array_seperate <- as.list(rep(1, length(metadata_seperate))) } for (i in 1:length(final_order_list)) { - if (!is.null(data_array)) { + if (rebuild_data) { array_piece[[i]] <- ClimProjDiags::Subset( data_array_seperate[[which_chunk[i]]], across_inner_dim, ind_in_array_seperate[[which_chunk[i]]]:(ind_in_array_seperate[[which_chunk[i]]] + how_many_indices[i] - 1)) } - if (!is.null(metadata)) { + if (rebuild_metadata) { metadata_piece[[i]] <- ClimProjDiags::Subset( metadata_seperate[[which_chunk[i]]], across_inner_dim, ind_in_array_seperate[[which_chunk[i]]]:(ind_in_array_seperate[[which_chunk[i]]] + how_many_indices[i] - 1)) } ind_in_array_seperate[[which_chunk[i]]] <- ind_in_array_seperate[[which_chunk[i]]] + how_many_indices[i] } - + # re-build the array: paste - if (!is.null(data_array)) { + if (rebuild_data) { data_array_tmp <- array_piece[[1]] } else { data_array_tmp <- NULL } - if (!is.null(metadata)) { + if (rebuild_metadata) { metadata_tmp <- metadata_piece[[1]] } else { metadata_tmp <- NULL } - if (!is.null(data_array)) { + if (rebuild_data) { along_pos <- which(names(dim(data_array_tmp)) == across_inner_dim) length_piece <- length(array_piece) - } else if (!is.null(metadata)) { - along_pos <- which(names(dim(metadata_tmp)) == across_inner_dim) - length_piece <- length(metadata_piece) + } + if (rebuild_metadata) { + along_pos_metadata <- which(names(dim(metadata_tmp)) == across_inner_dim) + if (!rebuild_data) + length_piece <- length(metadata_piece) } if (length_piece > 1) { for (i in 2:length_piece) { - if (!is.null(data_array)) { + if (rebuild_data) { data_array_tmp <- abind::abind(data_array_tmp, array_piece[[i]], along = along_pos) } - if (!is.null(metadata)) { + if (rebuild_metadata) { metadata_tmp <- abind::abind(metadata_tmp, metadata_piece[[i]], - along = along_pos) + along = along_pos_metadata) } } }