From 21967f1bc059d75fa9f94f6bf775060b97a3fb82 Mon Sep 17 00:00:00 2001 From: Jan Marvin Garbuszus Date: Fri, 14 Jul 2023 19:58:57 +0200 Subject: [PATCH] change function name to wb_dims() handle some exceptions --- NAMESPACE | 2 +- R/utils.R | 51 +++++++++++++++++++++++++++---------- man/dims_helper.Rd | 10 +++++--- tests/testthat/test-utils.R | 23 ++++++++++++----- 4 files changed, 62 insertions(+), 24 deletions(-) diff --git a/NAMESPACE b/NAMESPACE index 7b6d610c1..9429420ee 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -27,7 +27,6 @@ export(create_tablestyle) export(current_sheet) export(dataframe_to_dims) export(delete_data) -export(dims) export(dims_to_dataframe) export(dims_to_rowcol) export(fmt_txt) @@ -77,6 +76,7 @@ export(wb_color) export(wb_colour) export(wb_copy_cells) export(wb_data) +export(wb_dims) export(wb_freeze_pane) export(wb_get_active_sheet) export(wb_get_base_font) diff --git a/R/utils.R b/R/utils.R index f6a9e4cdd..e0c1ce359 100644 --- a/R/utils.R +++ b/R/utils.R @@ -261,9 +261,14 @@ rowcol_to_dim <- function(row, col) { } #' @rdname dims_helper -#' @param ... dims arguments, row/col, rows/cols or objects that can be converted to data frame +#' @param ... construct dims arguments, from rows/cols vectors or objects that can be coerced to data frame +#' @examples +#' # either vectors +#' wb_dims(rows = 1:10, cols = 1:10) +#' # or objects +#' wb_dims(mtcars) #' @export -dims <- function(...) { +wb_dims <- function(...) { args <- list(...) nams <- names(args) @@ -271,28 +276,48 @@ dims <- function(...) { col_names <- args$col_names row_names <- args$row_names - if (is.null(col_names)) col_names <- FALSE - if (is.null(row_names)) row_names <- FALSE + has_cnam <- is.null(col_names) + has_rnam <- is.null(row_names) + + if (has_cnam) col_names <- FALSE + if (has_rnam) row_names <- FALSE assert_class(col_names, "logical") assert_class(row_names, "logical") - if (any("row" %in% nams) && any("col" %in% nams)) { - dims <- rowcol_to_dim(args$row, args$col) - } else if (any("rows" %in% nams) && any("cols" %in% nams)) { - dims <- rowcol_to_dims(args$rows, args$cols) + # wb_dims(rows, cols) + if (length(args) == 2 && has_cnam && has_rnam) { + rows <- 1L + cols <- 2L + + # wb_dims(rows = rows, cols = cols) + sel <- pmatch(nams, c("rows", "cols")) + valid <- length(sel[!is.na(sel)]) + if (valid == 2) { + rows <- sel[rows] + cols <- sel[cols] + } else if (valid == 1) { + stop("found only one cols/rows argument") + } + + rows <- args[[rows]] + cols <- args[[cols]] + } else { + # wb_dims(data.frame()) x <- as.data.frame(args[[1]]) rows <- seq_len(nrow(x) + col_names) cols <- seq_len(ncol(x) + row_names) - if (length(rows) == 1L && length(cols) == 1L) { - dims <- rowcol_to_dim(rows, cols) - } else { - dims <- rowcol_to_dims(rows, cols) - } + } + if (length(rows) == 1 && length(cols) == 1) { + # A1 + dims <- rowcol_to_dim(rows, cols) + } else { + # A1:B2 + dims <- rowcol_to_dims(rows, cols) } dims diff --git a/man/dims_helper.Rd b/man/dims_helper.Rd index 6d822f85f..21077ca45 100644 --- a/man/dims_helper.Rd +++ b/man/dims_helper.Rd @@ -4,14 +4,14 @@ \alias{dims_helper} \alias{dims_to_rowcol} \alias{rowcol_to_dims} -\alias{dims} +\alias{wb_dims} \title{Helper functions to work with \code{dims}} \usage{ dims_to_rowcol(x, as_integer = FALSE) rowcol_to_dims(row, col) -dims(...) +wb_dims(...) } \arguments{ \item{x}{a dimension object "A1" or "A1:A1"} @@ -22,7 +22,7 @@ dims(...) \item{col}{a numeric or character vector of cols} -\item{...}{dims arguments, row/col, rows/cols or objects that can be converted to data frame} +\item{...}{construct dims arguments, from rows/cols vectors or objects that can be coerced to data frame} } \value{ \itemize{ @@ -37,4 +37,8 @@ vector. Exported for user convenience. \examples{ dims_to_rowcol("A1:J10") rowcol_to_dims(1:10, 1:10) +# either vectors +wb_dims(rows = 1:10, cols = 1:10) +# or objects +wb_dims(mtcars) } diff --git a/tests/testthat/test-utils.R b/tests/testthat/test-utils.R index 1a731b292..088581ed1 100644 --- a/tests/testthat/test-utils.R +++ b/tests/testthat/test-utils.R @@ -46,21 +46,30 @@ test_that("dims to col & row and back", { }) -test_that("dims() works", { +test_that("wb_dims() works", { # dim(mtcars) - expect_equal(dims(mtcars), "A1:K32") + expect_equal(wb_dims(mtcars), "A1:K32") + expect_equal(wb_dims(mtcars, col_names = TRUE, row_names = TRUE), "A1:L33") - expect_equal(dims(letters), "A1:A26") + expect_equal(wb_dims(letters), "A1:A26") - expect_equal(dims(t(letters)), "A1:Z1") + expect_equal(wb_dims(t(letters)), "A1:Z1") - expect_equal(dims(1), "A1") + expect_equal(wb_dims(1), "A1") - expect_equal(dims(rows = 1:10, cols = 5:7), "E1:G10") + expect_equal(wb_dims(rows = 1:10, cols = 5:7), "E1:G10") + expect_equal(wb_dims(cols = 1:10, rows = 5:7), "A5:J7") + expect_error( + wb_dims(cols = 1:10, col = 5:7), + "found only one cols/rows argument" + ) + + expect_equal(wb_dims(row = 5, col = 7), "G5") - expect_equal(dims(row = 5, col = 7), "G5") + expect_equal(wb_dims(1:10, LETTERS), "A1:Z10") + expect_equal(wb_dims(1:10, 1:26), "A1:Z10") })