diff --git a/R/repmat.R b/R/repmat.R index be72325..5c5e92f 100644 --- a/R/repmat.R +++ b/R/repmat.R @@ -3,15 +3,16 @@ #' @details This function was created to replicate the behavior of a homonymous #' function on Matlab #' @param mx matrix -#' @param n either a scalar with the number of replications in both rows and columns or a 2-length vector with individual repetitions. +#' @param n either a scalar with the number of replications in both rows and +#' columns or a <= 3-length vector with individual repetitions. #' @return matrix replicated over `ncol(mx) * n` columns and `nrow(mx) * n` rows #' @note The Matlab implementation of this function accepts `n` with length > 2. -#' +#' #' It should also be noted that a concatenated vector in R, e.g. `c(5, 2)`, becomes a column vector when coerced to matrix, even though it may look like a row vector at first glance. This is important to keep in mind when considering the expected output of this function. Vectors in R make sense to be seen as column vectors, given R's Statistics-oriented paradigm where variables are usually disposed as columns in a dataset. #' @export repmat <- function (mx, n) { # Validation - if (length(n) > 2) warning("Extra dimensions of n ignored") + if (length(n) > 3) warning("Extra dimensions of n ignored") if (length(n) == 1) n <- rep(n, 2) if (class(mx) != "matrix") mx <- as.matrix(mx) @@ -23,6 +24,9 @@ repmat <- function (mx, n) { for (i in seq(n[1] - 1)) out <- rbind(out, mx_col) } + # Replicating 3rd dimension + if (!is.na(n[3]) & n[3] > 1) out <- array(out, c(dim(out), n[3])) + # Output - return(unname(as.matrix(out))) + return(unname(as.array(out))) } \ No newline at end of file diff --git a/tests/testthat/test-convertedBaseFunctions.R b/tests/testthat/test-convertedBaseFunctions.R index 6ef25ba..7f75050 100644 --- a/tests/testthat/test-convertedBaseFunctions.R +++ b/tests/testthat/test-convertedBaseFunctions.R @@ -28,6 +28,10 @@ test_that("repmat works properly", { object = repmat(mx2, c(4, 1)), expected = rbind(mx2, mx2, mx2, mx2) ) + expect_equal( + object = repmat(mx2, c(1, 1, 2)), + expected = array(mx2, c(2, 2, 2)) + ) }) test_that("zeros and ones work as expected", {