From f18a8c618b105f9163b902ef04a083c8a7a94ef0 Mon Sep 17 00:00:00 2001 From: aho Date: Fri, 18 Mar 2022 19:20:15 +0100 Subject: [PATCH 1/5] Modify split case --- R/Start.R | 38 ++++++---- R/Utils.R | 14 ++++ .../testthat/test-Start-metadata_reshaping.R | 75 ++++++++++++++++++- 3 files changed, 113 insertions(+), 14 deletions(-) diff --git a/R/Start.R b/R/Start.R index f615336..bcd6943 100644 --- a/R/Start.R +++ b/R/Start.R @@ -3744,8 +3744,21 @@ Start <- function(..., # dim = indices/selectors, final_dims_fake_merge_dim <- final_dims_fake[names(final_dims_fake) %in% names(all_split_dims[[across_inner_dim]])] } } else if (split_multiselected_dims) { - tmp_attr <- attr(picked_common_vars[[names(all_split_dims)]], 'variables') - final_dims_fake_merge_dim <- all_split_dims[[1]] + tmp_fun <- function (x, y) { + any(names(dim(x)) %in% y) + } + inner_dim_has_split_dim <- names(which(unlist(lapply( + picked_common_vars, tmp_fun, names(all_split_dims))))) + if (!identical(inner_dim_has_split_dim, character(0))) { + tmp_attr <- attr(picked_common_vars[[inner_dim_has_split_dim]], 'variables') + target_split_dim_ind <- which(names(dim(picked_common_vars[[inner_dim_has_split_dim]])) == names(all_split_dims)) + margin_dim_ind <- c(1:length(dim(picked_common_vars[[inner_dim_has_split_dim]])))[-target_split_dim_ind] + if (identical(margin_dim_ind, numeric(0)) | identical(margin_dim_ind, integer(0))) { + final_dims_fake_merge_dim <- all_split_dims[[1]] + } else { + final_dims_fake_merge_dim <- .ReplaceElementInVector(dim(picked_common_vars[[inner_dim_has_split_dim]]), target = names(all_split_dims), new_val = all_split_dims[[1]]) + } + } } # The following several lines will only run if retrieve = TRUE @@ -3945,17 +3958,16 @@ Start <- function(..., # dim = indices/selectors, attr(picked_common_vars[[across_inner_dim]], 'variables') <- tmp_attr } if (split_multiselected_dims) { - if (names(all_split_dims) %in% names(picked_common_vars)) { - metadata_tmp <- array(picked_common_vars[[names(all_split_dims)]], dim = final_dims_fake_merge_dim) + if (!identical(inner_dim_has_split_dim, character(0))) { + metadata_tmp <- array(picked_common_vars[[inner_dim_has_split_dim]], dim = final_dims_fake_merge_dim) # Convert numeric back to dates - if ('time' %in% synonims[[names(all_split_dims)]]) { + if (is(picked_common_vars[[inner_dim_has_split_dim]], 'POSIXct')) { metadata_tmp <- as.POSIXct(metadata_tmp, origin = "1970-01-01", tz = 'UTC') } - picked_common_vars[[names(all_split_dims)]] <- metadata_tmp - attr(picked_common_vars[[names(all_split_dims)]], 'variables') <- tmp_attr + picked_common_vars[[inner_dim_has_split_dim]] <- metadata_tmp + attr(picked_common_vars[[inner_dim_has_split_dim]], 'variables') <- tmp_attr } } - } gc() @@ -4074,14 +4086,14 @@ Start <- function(..., # dim = indices/selectors, attr(picked_common_vars[[across_inner_dim]], 'variables') <- tmp_attr } if (split_multiselected_dims) { - if (names(all_split_dims) %in% names(picked_common_vars)) { - metadata_tmp <- array(picked_common_vars[[names(all_split_dims)]], dim = final_dims_fake_merge_dim) + if (!identical(inner_dim_has_split_dim, character(0))) { + metadata_tmp <- array(picked_common_vars[[inner_dim_has_split_dim]], dim = final_dims_fake_merge_dim) # Convert numeric back to dates - if ('time' %in% synonims[[names(all_split_dims)]]) { + if (is(picked_common_vars[[inner_dim_has_split_dim]], 'POSIXct')) { metadata_tmp <- as.POSIXct(metadata_tmp, origin = "1970-01-01", tz = 'UTC') } - picked_common_vars[[names(all_split_dims)]] <- metadata_tmp - attr(picked_common_vars[[names(all_split_dims)]], 'variables') <- tmp_attr + picked_common_vars[[inner_dim_has_split_dim]] <- metadata_tmp + attr(picked_common_vars[[inner_dim_has_split_dim]], 'variables') <- tmp_attr } } } diff --git a/R/Utils.R b/R/Utils.R index 425336e..11d239f 100644 --- a/R/Utils.R +++ b/R/Utils.R @@ -844,3 +844,17 @@ .KnownLatNames <- function() { known_lat_names <- c('lat', 'latitude', 'y', 'j', 'nav_lat') } + +.ReplaceElementInVector <- function(x, target, new_val) { + # x is a vector with name + # target is a string + # new_val is a vector with name + # E.g., Change [a = 2, b = 3] to [c = 1, d = 2, b = 3], then: + # x = c(a = 2, b = 3), target = 'a', new_val = c(c = 1, d = 2) + new_names <- unlist(lapply(as.list(names(x)), function(x) if (x == target) names(new_val) else x)) + new_list <- vector('list', length = length(new_names)) + for (i in 1:length(new_list)) { + new_list[[i]] <- c(new_val, x)[which(c(names(new_val), names(x)) == new_names[i])] + } + return(unlist(new_list)) +} diff --git a/tests/testthat/test-Start-metadata_reshaping.R b/tests/testthat/test-Start-metadata_reshaping.R index 91a793d..2374571 100644 --- a/tests/testthat/test-Start-metadata_reshaping.R +++ b/tests/testthat/test-Start-metadata_reshaping.R @@ -387,7 +387,7 @@ dates }) -test_that("6. split dim only", { +test_that("6. split time dim only", { datess <- seq(as.POSIXct('1994-07-01', tz = 'UTC'), as.POSIXct('1994-07-14', tz = 'UTC'), by = 'days') datess <- as.POSIXct(array(datess, dim = c(time = 7, week = 2)), @@ -544,3 +544,76 @@ dates }) + +test_that("8. split sdate dim", { + +file_date <- array(c(paste0(1993:1995, '07'), paste0(1993:1995, '08')), + dim = c(syear = 3, smonth = 2)) +suppressWarnings( +data <- Start(dat = paste0('/esarchive/recon/ecmwf/erainterim/6hourly/', + '$var$/$var$_$file_date$.nc'), + var = 'tas', + file_date = file_date, #[syear = 3, smonth = 2] + time = indices(1:2), + latitude = indices(1), + longitude = indices(1), + split_multiselected_dims = TRUE, + return_vars = list(latitude = NULL, + longitude = NULL, + time = 'file_date'), + retrieve = TRUE) +) +dates <- attr(data,'Variables')$common[['time']] + + +expect_equal( +dim(dates), +c(syear = 3, smonth = 2, time = 2) +) +expect_equal( +dim(drop(data)), +dim(dates) +) +expect_equal( +length(attributes(dates)), +4 +) +expect_equal( +all(names(attributes(dates)) %in% c('variables', 'dim', 'class', 'tzone')), +TRUE +) +expect_equal( +class(dates), +c("POSIXct", "POSIXt") +) +expect_equal( +dates[, 1, 1], +seq(as.POSIXct('1993-07-01', tz = 'UTC'), as.POSIXct('1995-07-01', tz = 'UTC'), by = 'year') +) +expect_equal( +dates[, 2, 2], +seq(as.POSIXct('1993-08-01 06:00:00', tz = 'UTC'), as.POSIXct('1995-08-01 06:00:00', tz = 'UTC'), by = 'year') +) + +suppressWarnings( +dataF <- Start(dat = paste0('/esarchive/recon/ecmwf/erainterim/6hourly/', + '$var$/$var$_$file_date$.nc'), + var = 'tas', + file_date = file_date, #[syear = 3, smonth = 2] + time = indices(1:2), + latitude = indices(1), + longitude = indices(1), + split_multiselected_dims = TRUE, + return_vars = list(latitude = NULL, + longitude = NULL, + time = 'file_date'), + retrieve = FALSE) +) +datesF <- attr(dataF,'Variables')$common[['time']] +expect_equal( +datesF, +dates +) + +}) + -- GitLab From 16687146fa494430550ec01c78f705d787ddfe78 Mon Sep 17 00:00:00 2001 From: aho Date: Fri, 18 Mar 2022 20:32:54 +0100 Subject: [PATCH 2/5] Revise for new development --- tests/testthat/test-Start-split-merge.R | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/testthat/test-Start-split-merge.R b/tests/testthat/test-Start-split-merge.R index fe686dc..8793296 100644 --- a/tests/testthat/test-Start-split-merge.R +++ b/tests/testthat/test-Start-split-merge.R @@ -176,10 +176,10 @@ c(dat = 1, var = 1, smonth = 2, syear = 2, time = 1, latitude = 18, longitude = ) expect_equal( dim(attr(obs, 'Variables')$common$time), -c(file_date = 4, time = 1) +c(smonth = 2, syear = 2, time = 1) ) expect_equal( -attr(obs, 'Variables')$common$time[1, 1], +attr(obs, 'Variables')$common$time[1, 1, 1], as.POSIXct('2013-11-15', tz = 'UTC') ) -- GitLab From 3a75d41dde838f3ef317b87084d73c574de55d74 Mon Sep 17 00:00:00 2001 From: aho Date: Fri, 18 Mar 2022 20:33:03 +0100 Subject: [PATCH 3/5] Modularize --- R/Start.R | 73 +++++++++++++++++++++++-------------------------------- R/zzz.R | 23 ++++++++++++++++++ 2 files changed, 54 insertions(+), 42 deletions(-) diff --git a/R/Start.R b/R/Start.R index bcd6943..51f47fa 100644 --- a/R/Start.R +++ b/R/Start.R @@ -3676,6 +3676,14 @@ Start <- function(..., # dim = indices/selectors, split_multiselected_dims <- FALSE .warning(paste0("Not found any dimensions able to be split. The parameter ", "'split_multiselected_dims' is changed to FALSE.")) + } else { + tmp_fun <- function (x, y) { + any(names(dim(x)) %in% y) + } + inner_dim_has_split_dim <- names(which(unlist(lapply( + picked_common_vars, tmp_fun, names(all_split_dims))))) + # If merge_across_dims also, it will be replaced later + saved_reshaped_attr <- attr(picked_common_vars[[inner_dim_has_split_dim]], 'variables') } } #====================================================================== @@ -3687,6 +3695,9 @@ Start <- function(..., # dim = indices/selectors, across_inner_dim <- inner_dims_across_files[[1]] #TODO: more than one? # Get the length of each inner_dim ('time') along each file_dim ('file_date') length_inner_across_dim <- lapply(dat[[i]][['selectors']][[across_inner_dim]][['fri']], length) + dims_of_merge_dim <- dim(picked_common_vars[[across_inner_dim]]) + # Save attributes for later use. If split_multiselected_dims, this variable has been created above but is replaced here + saved_reshaped_attr <- attr(picked_common_vars[[across_inner_dim]], 'variables') if (merge_across_dims_narm & !split_multiselected_dims) { final_dims_fake <- merge_narm_dims(final_dims_fake, across_inner_dim, length_inner_across_dim) @@ -3733,33 +3744,10 @@ Start <- function(..., # dim = indices/selectors, } } - if (merge_across_dims) { - # Save dim and attributes for later use - dims_of_merge_dim <- dim(picked_common_vars[[across_inner_dim]]) - tmp_attr <- attr(picked_common_vars[[across_inner_dim]], 'variables') - # Find final_dim_fake for metadata and put it in an array - if (!split_multiselected_dims) { - final_dims_fake_merge_dim <- final_dims_fake[names(final_dims_fake) %in% names(dims_of_merge_dim)] - } else { - final_dims_fake_merge_dim <- final_dims_fake[names(final_dims_fake) %in% names(all_split_dims[[across_inner_dim]])] - } - } else if (split_multiselected_dims) { - tmp_fun <- function (x, y) { - any(names(dim(x)) %in% y) - } - inner_dim_has_split_dim <- names(which(unlist(lapply( - picked_common_vars, tmp_fun, names(all_split_dims))))) - if (!identical(inner_dim_has_split_dim, character(0))) { - tmp_attr <- attr(picked_common_vars[[inner_dim_has_split_dim]], 'variables') - target_split_dim_ind <- which(names(dim(picked_common_vars[[inner_dim_has_split_dim]])) == names(all_split_dims)) - margin_dim_ind <- c(1:length(dim(picked_common_vars[[inner_dim_has_split_dim]])))[-target_split_dim_ind] - if (identical(margin_dim_ind, numeric(0)) | identical(margin_dim_ind, integer(0))) { - final_dims_fake_merge_dim <- all_split_dims[[1]] - } else { - final_dims_fake_merge_dim <- .ReplaceElementInVector(dim(picked_common_vars[[inner_dim_has_split_dim]]), target = names(all_split_dims), new_val = all_split_dims[[1]]) - } - } - } + final_dims_fake_metadata <- find_final_dims_fake_metadata( + merge_across_dims, split_multiselected_dims, picked_common_vars, across_inner_dim, + final_dims_fake, dims_of_merge_dim, all_split_dims, inner_dim_has_split_dim) + # The following several lines will only run if retrieve = TRUE if (retrieve) { @@ -3900,7 +3888,7 @@ Start <- function(..., # dim = indices/selectors, stop(paste0("After reshaping, the data do not fit into the expected output dimension. ", "Check if the reshaping parameters are used correctly.")) } - if (length(metadata_tmp) != prod(final_dims_fake_merge_dim)) { + if (length(metadata_tmp) != prod(final_dims_fake_metadata)) { stop(paste0("After reshaping, the metadata do not fit into the expected output dimension. ", "Check if the reshaping parameters are used correctly or contact support.")) } @@ -3916,7 +3904,7 @@ Start <- function(..., # dim = indices/selectors, } data_array <- array(data_array_tmp, dim = final_dims_fake) - metadata_tmp <- array(metadata_tmp, dim = final_dims_fake_merge_dim) + metadata_tmp <- array(metadata_tmp, dim = final_dims_fake_metadata) # If split_multiselected_dims + merge_across_dims, the dimension order may change above. # To get the user-required dim order, we need to reorder the array again. @@ -3934,7 +3922,7 @@ Start <- function(..., # dim = indices/selectors, } picked_common_vars[[across_inner_dim]] <- metadata_tmp - attr(picked_common_vars[[across_inner_dim]], 'variables') <- tmp_attr + attr(picked_common_vars[[across_inner_dim]], 'variables') <- saved_reshaped_attr } else { # ! (merge_across_dims + split_multiselected_dims) (old version) data_array <- array(bigmemory::as.matrix(data_array), dim = final_dims_fake) @@ -3949,23 +3937,23 @@ Start <- function(..., # dim = indices/selectors, tmp[file_dim_pos] <- inner_dim_pos picked_common_vars[[across_inner_dim]] <- .aperm2(picked_common_vars[[across_inner_dim]], tmp) } - metadata_tmp <- array(picked_common_vars[[across_inner_dim]], dim = final_dims_fake_merge_dim) + metadata_tmp <- array(picked_common_vars[[across_inner_dim]], dim = final_dims_fake_metadata) # Convert numeric back to dates if ('time' %in% synonims[[across_inner_dim]]) { metadata_tmp <- as.POSIXct(metadata_tmp, origin = "1970-01-01", tz = 'UTC') } picked_common_vars[[across_inner_dim]] <- metadata_tmp - attr(picked_common_vars[[across_inner_dim]], 'variables') <- tmp_attr + attr(picked_common_vars[[across_inner_dim]], 'variables') <- saved_reshaped_attr } if (split_multiselected_dims) { if (!identical(inner_dim_has_split_dim, character(0))) { - metadata_tmp <- array(picked_common_vars[[inner_dim_has_split_dim]], dim = final_dims_fake_merge_dim) + metadata_tmp <- array(picked_common_vars[[inner_dim_has_split_dim]], dim = final_dims_fake_metadata) # Convert numeric back to dates if (is(picked_common_vars[[inner_dim_has_split_dim]], 'POSIXct')) { metadata_tmp <- as.POSIXct(metadata_tmp, origin = "1970-01-01", tz = 'UTC') } picked_common_vars[[inner_dim_has_split_dim]] <- metadata_tmp - attr(picked_common_vars[[inner_dim_has_split_dim]], 'variables') <- tmp_attr + attr(picked_common_vars[[inner_dim_has_split_dim]], 'variables') <- saved_reshaped_attr } } } @@ -4035,7 +4023,7 @@ Start <- function(..., # dim = indices/selectors, metadata_tmp <- tmp$merge_dim_metadata } - if (length(metadata_tmp) != prod(final_dims_fake_merge_dim)) { + if (length(metadata_tmp) != prod(final_dims_fake_metadata)) { stop(paste0("After reshaping, the metadata do not fit into the expected output dimension. ", "Check if the reshaping parameters are used correctly or contact support.")) } @@ -4044,10 +4032,11 @@ Start <- function(..., # dim = indices/selectors, # chunks (i.e., work_piece) is necessary. if (split_multiselected_dims) { tmp <- rebuild_array_merge_split( - data_array = NULL, metadata = metadata_tmp, indices_chunk, all_split_dims, final_dims_fake, across_inner_dim, length_inner_across_dim) + data_array = NULL, metadata = metadata_tmp, indices_chunk, + all_split_dims, final_dims_fake, across_inner_dim, length_inner_across_dim) metadata_tmp <- tmp$metadata } - metadata_tmp <- array(metadata_tmp, dim = final_dims_fake_merge_dim) + metadata_tmp <- array(metadata_tmp, dim = final_dims_fake_metadata) # If split_multiselected_dims + merge_across_dims, the dimension order may change above. # To get the user-required dim order, we need to reorder the array again. @@ -4064,7 +4053,7 @@ Start <- function(..., # dim = indices/selectors, metadata_tmp <- as.POSIXct(metadata_tmp, origin = "1970-01-01", tz = 'UTC') } picked_common_vars[[across_inner_dim]] <- metadata_tmp - attr(picked_common_vars[[across_inner_dim]], 'variables') <- tmp_attr + attr(picked_common_vars[[across_inner_dim]], 'variables') <- saved_reshaped_attr } else { # ! (merge_across_dims + split_multiselected_dims) (old version) if (merge_across_dims) { # merge_across_dims = TRUE but (merge_across_dims_narm = F & split_multiselected_dims = F) @@ -4077,23 +4066,23 @@ Start <- function(..., # dim = indices/selectors, tmp[file_dim_pos] <- inner_dim_pos picked_common_vars[[across_inner_dim]] <- .aperm2(picked_common_vars[[across_inner_dim]], tmp) } - metadata_tmp <- array(picked_common_vars[[across_inner_dim]], dim = final_dims_fake_merge_dim) + metadata_tmp <- array(picked_common_vars[[across_inner_dim]], dim = final_dims_fake_metadata) # Convert numeric back to dates if ('time' %in% synonims[[across_inner_dim]]) { metadata_tmp <- as.POSIXct(metadata_tmp, origin = "1970-01-01", tz = 'UTC') } picked_common_vars[[across_inner_dim]] <- metadata_tmp - attr(picked_common_vars[[across_inner_dim]], 'variables') <- tmp_attr + attr(picked_common_vars[[across_inner_dim]], 'variables') <- saved_reshaped_attr } if (split_multiselected_dims) { if (!identical(inner_dim_has_split_dim, character(0))) { - metadata_tmp <- array(picked_common_vars[[inner_dim_has_split_dim]], dim = final_dims_fake_merge_dim) + metadata_tmp <- array(picked_common_vars[[inner_dim_has_split_dim]], dim = final_dims_fake_metadata) # Convert numeric back to dates if (is(picked_common_vars[[inner_dim_has_split_dim]], 'POSIXct')) { metadata_tmp <- as.POSIXct(metadata_tmp, origin = "1970-01-01", tz = 'UTC') } picked_common_vars[[inner_dim_has_split_dim]] <- metadata_tmp - attr(picked_common_vars[[inner_dim_has_split_dim]], 'variables') <- tmp_attr + attr(picked_common_vars[[inner_dim_has_split_dim]], 'variables') <- saved_reshaped_attr } } } diff --git a/R/zzz.R b/R/zzz.R index 83e2b7b..476fc8e 100644 --- a/R/zzz.R +++ b/R/zzz.R @@ -822,6 +822,29 @@ reorder_split_dims <- function(all_split_dims, inner_dim_pos_in_split_dims, fina return(list(final_dims_fake, all_split_dims)) } +# Find the final_dims_fake for metadata if it needs to be reshaped +find_final_dims_fake_metadata <- function(merge_across_dims, split_multiselected_dims, + picked_common_vars, across_inner_dim, final_dims_fake, + dims_of_merge_dim, all_split_dims, inner_dim_has_split_dim) { + if (merge_across_dims) { + if (!split_multiselected_dims) { + final_dims_fake_metadata <- final_dims_fake[names(final_dims_fake) %in% names(dims_of_merge_dim)] + } else { + final_dims_fake_metadata <- final_dims_fake[names(final_dims_fake) %in% names(all_split_dims[[across_inner_dim]])] + } + } else if (split_multiselected_dims) { + if (!identical(inner_dim_has_split_dim, character(0))) { + target_split_dim_ind <- which(names(dim(picked_common_vars[[inner_dim_has_split_dim]])) == names(all_split_dims)) + margin_dim_ind <- c(1:length(dim(picked_common_vars[[inner_dim_has_split_dim]])))[-target_split_dim_ind] + if (identical(margin_dim_ind, numeric(0)) | identical(margin_dim_ind, integer(0))) { + final_dims_fake_metadata <- all_split_dims[[1]] + } else { + final_dims_fake_metadata <- .ReplaceElementInVector(dim(picked_common_vars[[inner_dim_has_split_dim]]), target = names(all_split_dims), new_val = all_split_dims[[1]]) + } + } + } + return(final_dims_fake_metadata) +} # Build the work pieces. build_work_pieces <- function(work_pieces, i, selectors, file_dims, inner_dims, final_dims, -- GitLab From a66a20965f0e93699bc631ec14ba6a900f33ea85 Mon Sep 17 00:00:00 2001 From: aho Date: Fri, 18 Mar 2022 20:54:21 +0100 Subject: [PATCH 4/5] Add condition --- R/Start.R | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/R/Start.R b/R/Start.R index 51f47fa..2a818a1 100644 --- a/R/Start.R +++ b/R/Start.R @@ -3743,11 +3743,11 @@ Start <- function(..., # dim = indices/selectors, all_split_dims[[1]] <- tmp[[2]] } } - - final_dims_fake_metadata <- find_final_dims_fake_metadata( - merge_across_dims, split_multiselected_dims, picked_common_vars, across_inner_dim, - final_dims_fake, dims_of_merge_dim, all_split_dims, inner_dim_has_split_dim) - + if (merge_across_dims | split_multiselected_dims) { + final_dims_fake_metadata <- find_final_dims_fake_metadata( + merge_across_dims, split_multiselected_dims, picked_common_vars, across_inner_dim, + final_dims_fake, dims_of_merge_dim, all_split_dims, inner_dim_has_split_dim) + } # The following several lines will only run if retrieve = TRUE if (retrieve) { -- GitLab From 3e5aa2c9fa219ce6f5844a1b89918c871ec3d7cc Mon Sep 17 00:00:00 2001 From: aho Date: Mon, 21 Mar 2022 11:21:51 +0100 Subject: [PATCH 5/5] Condition statement fix --- R/Start.R | 7 +++++-- R/zzz.R | 1 + 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/R/Start.R b/R/Start.R index 2a818a1..ac4faba 100644 --- a/R/Start.R +++ b/R/Start.R @@ -3666,6 +3666,7 @@ Start <- function(..., # dim = indices/selectors, # Find the dimension to split if split_multiselected_dims = TRUE. # If there is no dimension able to be split, change split_multiselected_dims to FALSE. all_split_dims <- NULL + inner_dim_has_split_dim <- NULL if (split_multiselected_dims) { tmp <- dims_split(dim_params, final_dims_fake) final_dims_fake <- tmp[[1]] @@ -3682,8 +3683,10 @@ Start <- function(..., # dim = indices/selectors, } inner_dim_has_split_dim <- names(which(unlist(lapply( picked_common_vars, tmp_fun, names(all_split_dims))))) - # If merge_across_dims also, it will be replaced later - saved_reshaped_attr <- attr(picked_common_vars[[inner_dim_has_split_dim]], 'variables') + if (!identical(inner_dim_has_split_dim, character(0))) { + # If merge_across_dims also, it will be replaced later + saved_reshaped_attr <- attr(picked_common_vars[[inner_dim_has_split_dim]], 'variables') + } } } #====================================================================== diff --git a/R/zzz.R b/R/zzz.R index 476fc8e..8055c69 100644 --- a/R/zzz.R +++ b/R/zzz.R @@ -826,6 +826,7 @@ reorder_split_dims <- function(all_split_dims, inner_dim_pos_in_split_dims, fina find_final_dims_fake_metadata <- function(merge_across_dims, split_multiselected_dims, picked_common_vars, across_inner_dim, final_dims_fake, dims_of_merge_dim, all_split_dims, inner_dim_has_split_dim) { + final_dims_fake_metadata <- NULL if (merge_across_dims) { if (!split_multiselected_dims) { final_dims_fake_metadata <- final_dims_fake[names(final_dims_fake) %in% names(dims_of_merge_dim)] -- GitLab