diff --git a/NEWS.md b/NEWS.md index 295a972491a5f741f822b6e7c49f705a8e5e7f3d..ba586300e91d99e8648727deadeb6f77a519d38d 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,3 +1,6 @@ +# startR v2.0.4 (Release date: ) +- Bugfix for metadata retrieving when there are more than one dataset and one of them is missing. + # startR v2.0.1 (Release date: 2020-09-10) - /dev/shm automatic cleaning on Compute() # startR v2.0.1 (Release date: 2020-08-25) diff --git a/R/Start.R b/R/Start.R index 463d9159214ada4d799f9eaf34cc6d5b39ac6769..718ae42654791c500df7fa63bcb60806bf9efa1e 100644 --- a/R/Start.R +++ b/R/Start.R @@ -4141,9 +4141,14 @@ Start <- function(..., # dim = indices/selectors, loaded_metadata_count <- 1 for (kk in 1:length(return_metadata)) { for (jj in 1:length(return_metadata[[kk]])) { - return_metadata[[kk]][jj] <- loaded_metadata[[loaded_metadata_count]] - names(return_metadata[[kk]])[jj] <- names(loaded_metadata[[loaded_metadata_count]]) - loaded_metadata_count <- loaded_metadata_count + 1 + if (dataset_has_files[kk]) { + return_metadata[[kk]][jj] <- loaded_metadata[[loaded_metadata_count]] + names(return_metadata[[kk]])[jj] <- names(loaded_metadata[[loaded_metadata_count]]) + loaded_metadata_count <- loaded_metadata_count + 1 + } else { + return_metadata[[kk]][jj] <- NULL + } + } } } @@ -4230,8 +4235,10 @@ Start <- function(..., # dim = indices/selectors, var_backup <- attr(data_array, 'Variables') for (kk in 1:length(var_backup)) { sublist_names <- lapply(var_backup, names)[[kk]] - for (jj in 1:length(sublist_names)) { - picked_vars[[kk]][[sublist_names[jj]]] <- var_backup[[kk]][[jj]] + if (!is.null(sublist_names)) { + for (jj in 1:length(sublist_names)) { + picked_vars[[kk]][[sublist_names[jj]]] <- var_backup[[kk]][[jj]] + } } } var_backup <- NULL diff --git a/tests/testthat/test-Start-metadata_dims.R b/tests/testthat/test-Start-metadata_dims.R index b4ef3cf91ead8fd03a5beaee7af50d36db9ab2f4..0e53f07df6e04478907e5aaa8df13aeb9d32a6f7 100644 --- a/tests/testthat/test-Start-metadata_dims.R +++ b/tests/testthat/test-Start-metadata_dims.R @@ -329,3 +329,48 @@ data <- Start(repos = mask_path, ) }) + +test_that("7. Two data sets, while one is missing", { + repos <- "/esarchive/exp/ecmwf/system5_m1/monthly_mean/$var$_f6h/$var$_$sdate$.nc" + # incorrect path. Therefore repos2 doesn't have any valid files + repos2 <- "/esarchive/exp/ecmwf/system4_m1/monthly_mean/$var$_f2h/$var$_$sdate$.nc" # correct one is _f6h + var <- 'tas' + data <- Start(dat = list(list(name = 'system4_m1', path = repos2), + list(name = 'system5_m1', path = repos)), + var = var, + sdate = '20170101', + ensemble = indices(1), + time = indices(1), + lat = 'all', + lon = 'all', + synonims = list(lat = c('lat', 'latitude'), + lon = c('lon', 'longitude')), + return_vars = list(time = 'sdate', + longitude = 'dat', + latitude = 'dat'), + metadata_dims = 'dat', # it can be omitted since it is automatically specified as 'dat' + retrieve = T + ) + + expect_equal( + length(data[is.na(data)]), + 829440 + ) + expect_equal( + attr(data, "Variables")$system4_m1, + NULL + ) + expect_equal( + length(attr(data, "Variables")$system5_m1$longitude), + 1296 + ) + expect_equal( + length(attr(data, "Variables")$system5_m1), + 3 + ) + expect_equal( + attr(data, 'Files'), + array(c(NA, "/esarchive/exp/ecmwf/system5_m1/monthly_mean/tas_f6h/tas_20170101.nc"), + dim = c(dat = 2, var = 1, sdate = 1)) + ) +})