diff --git a/R/Ano.R b/R/Ano.R index 4b2b8767b240b8c867dd3f92cf62600ed31510d9..ed3350a24b6cd382125f2df6d4306fd42251f40a 100644 --- a/R/Ano.R +++ b/R/Ano.R @@ -4,26 +4,56 @@ Ano <- function(var, clim) { # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # dimvar <- dim(var) - + if (length(dim(clim)) <= 2) { clim <- InsertDim(clim, 2, dimvar[2]) } + if ((length(dimvar) > length(dim(clim))) & (dim(clim)[2] != dimvar[2])) { clim <- InsertDim(clim, 2, dimvar[2]) } + if ((length(dimvar) > length(dim(clim))) & (dim(clim)[2] == dimvar[2])) { + if (is.null(names(dim(clim))) | is.null(names(dimvar))) { + stop('Provide dimension names on parameter \'var\' and \'clim\' to avoid ambiguity.') + } else { + if (names(dim(clim)[2]) != names(dimvar[2])) { + clim <- InsertDim(clim, 2, dimvar[2]) + } + } + } + if ((length(dimvar) > length(dim(clim))) & (dim(clim)[3] != dimvar[3])) { clim <- InsertDim(clim, 3, dimvar[3]) } + if ((length(dimvar) > length(dim(clim))) & (dim(clim)[3] == dimvar[3])) { + if (is.null(names(dim(clim))) | is.null(names(dimvar))) { + stop('Provide dimension names on parameter \'var\' and \'clim\' to avoid ambiguity.') + } else { + if (names(dim(clim)[3]) != names(dimvar[3])) { + clim <- InsertDim(clim, 3, dimvar[3]) + } + } + } + if ((length(dimvar) > length(dim(clim))) & (dim(clim)[4] != dimvar[4])) { clim <- InsertDim(clim, 4, dimvar[4]) } - + if ((length(dimvar) > length(dim(clim))) & (dim(clim)[4] == dimvar[4])) { + if (is.null(names(dim(clim))) | is.null(names(dimvar))) { + stop('Provide dimension names on parameter \'var\' and \'clim\' to avoid ambiguity.') + } else { + if (names(dim(clim)[4]) != names(dimvar[4])) { + clim <- InsertDim(clim, 4, dimvar[4]) + } + } + } + # # Raw anomalies # ~~~~~~~~~~~~~~~ # ano <- var - clim - + # # Outputs # ~~~~~~~~~ diff --git a/tests/testthat/test-Ano.R b/tests/testthat/test-Ano.R new file mode 100644 index 0000000000000000000000000000000000000000..aa3d2796a73c723584af5da880f642a253ddf4a9 --- /dev/null +++ b/tests/testthat/test-Ano.R @@ -0,0 +1,27 @@ +context("Generic tests") +test_that("Sanity checks", { + + var <- array(rnorm(16), c(2, 2, 2, 2)) + names(dim(var)) <- c("memb", "lon", "sdates", "lat") + clim <- apply(var, c(1, 2, 4), mean) + names(dim(clim)) <- NULL + expect_error( + Ano(var, clim), + "Provide dimension names on parameter \'var\' and \'clim\' to avoid ambiguity." + ) + + t <- array(rnorm(76), c(1, 3, 4, 3, 2, 2)) + names(dim(t)) <- c("mod", "memb", "sdates", "ltime", "lon", "lat") + c3 <- Clim(t, t, memb = TRUE)$clim_exp # Clim for each member + c1 <- InsertDim(c3[, 1, ,, ], 1, 1) # clim as if memb=FALSE but identical to member 1 + names(dim(c1)) <- c("mod", "ltime", "lon", "lat") + identical(c1[, , , ], c3[, 1, , , ]) # results in TRUE + a3 <- Ano(t, c3) # ano for each member individually + a1 <- Ano(t, c1) # ano for first member + + expect_equal( + a1[, 1, , , , ], + a3[, 1, , , , ] + ) + +})