diff --git a/DESCRIPTION b/DESCRIPTION index 9891364a4..6ece7b986 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -38,7 +38,7 @@ Imports: pkgconfig, rlang (>= 1.0.2), utils, - vctrs (>= 0.4.2) + vctrs (>= 0.5.0) Suggests: bench, bit64, diff --git a/R/add.R b/R/add.R index c7beadf7e..21c11f2d5 100644 --- a/R/add.R +++ b/R/add.R @@ -125,7 +125,7 @@ rbind_at <- function(old, new, pos) { #' #' @export add_column <- function(.data, ..., .before = NULL, .after = NULL, - .name_repair = c("check_unique", "unique", "universal", "minimal")) { + .name_repair = c("check_unique", "unique", "universal", "minimal", "unique_quiet", "universal_quiet")) { if (!is.data.frame(.data)) { deprecate_stop("2.1.1", "add_column(.data = 'must be a data frame')") } diff --git a/R/as_tibble.R b/R/as_tibble.R index cca3d694a..85c326400 100644 --- a/R/as_tibble.R +++ b/R/as_tibble.R @@ -59,7 +59,7 @@ #' df <- as_tibble(m) as_tibble <- function(x, ..., .rows = NULL, - .name_repair = c("check_unique", "unique", "universal", "minimal"), + .name_repair = c("check_unique", "unique", "universal", "minimal", "unique_quiet", "universal_quiet"), rownames = pkgconfig::get_config("tibble::rownames", NULL)) { UseMethod("as_tibble") } @@ -68,7 +68,7 @@ as_tibble <- function(x, ..., #' @rdname as_tibble as_tibble.data.frame <- function(x, validate = NULL, ..., .rows = NULL, - .name_repair = c("check_unique", "unique", "universal", "minimal"), + .name_repair = c("check_unique", "unique", "universal", "minimal", "unique_quiet", "universal_quiet"), rownames = pkgconfig::get_config("tibble::rownames", NULL)) { if (!is.null(validate)) { deprecate_stop("2.0.0", "tibble::as_tibble(validate = )", "as_tibble(.name_repair =)") @@ -103,7 +103,7 @@ as_tibble.data.frame <- function(x, validate = NULL, ..., #' @export #' @rdname as_tibble as_tibble.list <- function(x, validate = NULL, ..., .rows = NULL, - .name_repair = c("check_unique", "unique", "universal", "minimal")) { + .name_repair = c("check_unique", "unique", "universal", "minimal", "unique_quiet", "universal_quiet")) { if (!is.null(validate)) { deprecate_stop("2.0.0", "tibble::as_tibble(validate = )", "as_tibble(.name_repair =)") } @@ -279,7 +279,7 @@ as_tibble.default <- function(x, ...) { #' as_tibble_row(list(c = "three", d = list(4:5))) #' as_tibble_row(1:3, .name_repair = "unique") as_tibble_row <- function(x, - .name_repair = c("check_unique", "unique", "universal", "minimal")) { + .name_repair = c("check_unique", "unique", "universal", "minimal", "unique_quiet", "universal_quiet")) { if (!vec_is(x)) { abort_as_tibble_row_vector(x) } diff --git a/R/names.R b/R/names.R index 1e677f893..b5847353b 100644 --- a/R/names.R +++ b/R/names.R @@ -1,5 +1,5 @@ vectbl_names2 <- function(x, - .name_repair = c("check_unique", "unique", "universal", "minimal"), + .name_repair = c("check_unique", "unique", "universal", "minimal", "unique_quiet", "universal_quiet"), quiet = FALSE, call = caller_env()) { name <- vec_names2(x, repair = "minimal", quiet = quiet) @@ -8,7 +8,7 @@ vectbl_names2 <- function(x, set_repaired_names <- function(x, repair_hint, - .name_repair = c("check_unique", "unique", "universal", "minimal"), + .name_repair = c("check_unique", "unique", "universal", "minimal", "unique_quiet", "universal_quiet"), quiet = FALSE, call = caller_env()) { names <- repaired_names(names2(x), repair_hint, .name_repair = .name_repair, quiet = quiet, call = call) @@ -17,7 +17,7 @@ set_repaired_names <- function(x, repaired_names <- function(name, repair_hint, - .name_repair = c("check_unique", "unique", "universal", "minimal"), + .name_repair = c("check_unique", "unique", "universal", "minimal", "unique_quiet", "universal_quiet"), quiet = FALSE, details = NULL, call = caller_env()) { diff --git a/R/tibble.R b/R/tibble.R index f82818f49..3ac25050c 100644 --- a/R/tibble.R +++ b/R/tibble.R @@ -44,6 +44,8 @@ #' * `"check_unique"`: (default value), no name repair, but check they are #' `unique`, #' * `"universal"`: Make the names `unique` and syntactic +#' * `"unique_quiet"`: Same as `"unique"`, but "quiet" +#' * `"universal_quiet"`: Same as `"universal"`, but "quiet" #' * a function: apply custom name repair (e.g., `.name_repair = make.names` #' for names in the style of base R). #' * A purrr-style anonymous function, see [rlang::as_function()] @@ -157,7 +159,7 @@ #' try(tibble(a = 2, b = !!bogus)) tibble <- function(..., .rows = NULL, - .name_repair = c("check_unique", "unique", "universal", "minimal")) { + .name_repair = c("check_unique", "unique", "universal", "minimal", "unique_quiet", "universal_quiet")) { xs <- quos(...) tibble_quos(xs, .rows, .name_repair) @@ -177,7 +179,7 @@ tibble <- function(..., #' # Use tibble_row() to construct a one-row tibble: #' tibble_row(a = 1, lm = lm(Height ~ Girth + Volume, data = trees)) tibble_row <- function(..., - .name_repair = c("check_unique", "unique", "universal", "minimal")) { + .name_repair = c("check_unique", "unique", "universal", "minimal", "unique_quiet", "universal_quiet")) { xs <- enquos(...) tibble_quos(xs, .rows = 1, .name_repair = .name_repair, single_row = TRUE) diff --git a/man/add_column.Rd b/man/add_column.Rd index 4ae5c6655..d2a15f8e2 100644 --- a/man/add_column.Rd +++ b/man/add_column.Rd @@ -9,7 +9,8 @@ add_column( ..., .before = NULL, .after = NULL, - .name_repair = c("check_unique", "unique", "universal", "minimal") + .name_repair = c("check_unique", "unique", "universal", "minimal", "unique_quiet", + "universal_quiet") ) } \arguments{ @@ -29,6 +30,8 @@ new columns, default: after last column.} \item \code{"check_unique"}: (default value), no name repair, but check they are \code{unique}, \item \code{"universal"}: Make the names \code{unique} and syntactic +\item \code{"unique_quiet"}: Same as \code{"unique"}, but "quiet" +\item \code{"universal_quiet"}: Same as \code{"universal"}, but "quiet" \item a function: apply custom name repair (e.g., \code{.name_repair = make.names} for names in the style of base R). \item A purrr-style anonymous function, see \code{\link[rlang:as_function]{rlang::as_function()}} diff --git a/man/as_tibble.Rd b/man/as_tibble.Rd index 4397e3d6b..e1580a8e5 100644 --- a/man/as_tibble.Rd +++ b/man/as_tibble.Rd @@ -16,7 +16,8 @@ as_tibble( x, ..., .rows = NULL, - .name_repair = c("check_unique", "unique", "universal", "minimal"), + .name_repair = c("check_unique", "unique", "universal", "minimal", "unique_quiet", + "universal_quiet"), rownames = pkgconfig::get_config("tibble::rownames", NULL) ) @@ -25,7 +26,8 @@ as_tibble( validate = NULL, ..., .rows = NULL, - .name_repair = c("check_unique", "unique", "universal", "minimal"), + .name_repair = c("check_unique", "unique", "universal", "minimal", "unique_quiet", + "universal_quiet"), rownames = pkgconfig::get_config("tibble::rownames", NULL) ) @@ -34,7 +36,8 @@ as_tibble( validate = NULL, ..., .rows = NULL, - .name_repair = c("check_unique", "unique", "universal", "minimal") + .name_repair = c("check_unique", "unique", "universal", "minimal", "unique_quiet", + "universal_quiet") ) \method{as_tibble}{matrix}(x, ..., validate = NULL, .name_repair = NULL) @@ -47,7 +50,8 @@ as_tibble( as_tibble_row( x, - .name_repair = c("check_unique", "unique", "universal", "minimal") + .name_repair = c("check_unique", "unique", "universal", "minimal", "unique_quiet", + "universal_quiet") ) as_tibble_col(x, column_name = "value") @@ -68,6 +72,8 @@ just as an additional check.} \item \code{"check_unique"}: (default value), no name repair, but check they are \code{unique}, \item \code{"universal"}: Make the names \code{unique} and syntactic +\item \code{"unique_quiet"}: Same as \code{"unique"}, but "quiet" +\item \code{"universal_quiet"}: Same as \code{"universal"}, but "quiet" \item a function: apply custom name repair (e.g., \code{.name_repair = make.names} for names in the style of base R). \item A purrr-style anonymous function, see \code{\link[rlang:as_function]{rlang::as_function()}} diff --git a/man/tibble.Rd b/man/tibble.Rd index 1212393d3..58ea5755b 100644 --- a/man/tibble.Rd +++ b/man/tibble.Rd @@ -8,12 +8,14 @@ tibble( ..., .rows = NULL, - .name_repair = c("check_unique", "unique", "universal", "minimal") + .name_repair = c("check_unique", "unique", "universal", "minimal", "unique_quiet", + "universal_quiet") ) tibble_row( ..., - .name_repair = c("check_unique", "unique", "universal", "minimal") + .name_repair = c("check_unique", "unique", "universal", "minimal", "unique_quiet", + "universal_quiet") ) } \arguments{ @@ -39,6 +41,8 @@ just as an additional check.} \item \code{"check_unique"}: (default value), no name repair, but check they are \code{unique}, \item \code{"universal"}: Make the names \code{unique} and syntactic +\item \code{"unique_quiet"}: Same as \code{"unique"}, but "quiet" +\item \code{"universal_quiet"}: Same as \code{"universal"}, but "quiet" \item a function: apply custom name repair (e.g., \code{.name_repair = make.names} for names in the style of base R). \item A purrr-style anonymous function, see \code{\link[rlang:as_function]{rlang::as_function()}} diff --git a/tests/testthat/test-as_tibble.R b/tests/testthat/test-as_tibble.R index fcc640a29..24219ecc6 100644 --- a/tests/testthat/test-as_tibble.R +++ b/tests/testthat/test-as_tibble.R @@ -188,6 +188,36 @@ test_that("as_tibble() implements universal names", { ) }) +test_that("as_tibble() implements unique_quiet", { + skip_if_not_installed("vctrs", "0.5.0") + + expect_no_message({ + invalid_df <- as_tibble(list(3, 4, 5), .name_repair = "unique_quiet") + }) + expect_equal(length(invalid_df), 3) + expect_equal(nrow(invalid_df), 1) + # it is "quiet" despite `quiet` being FALSE + expect_equal( + names(invalid_df), + vec_as_names(rep("", 3), repair = "unique_quiet", quiet = FALSE) + ) +}) + +test_that("as_tibble() implements universal_quiet", { + skip_if_not_installed("vctrs", "0.5.0") + + expect_no_message({ + invalid_df <- as_tibble(list(3, 4, 5), .name_repair = "universal_quiet") + }) + expect_equal(length(invalid_df), 3) + expect_equal(nrow(invalid_df), 1) + # it is "quiet" despite `quiet` being FALSE + expect_equal( + names(invalid_df), + vec_as_names(rep("", 3), repair = "universal_quiet", quiet = FALSE) + ) +}) + test_that("as_tibble() implements custom name repair", { expect_silent(