From d027ef50c486abae5cdf3b3f0566d80cdf643263 Mon Sep 17 00:00:00 2001 From: DavisVaughan Date: Fri, 6 Dec 2019 11:25:44 -0500 Subject: [PATCH 1/3] Use `is_unspecified()` in `vec_cast.list.default()` --- R/type-bare.R | 2 +- tests/testthat/test-type-bare.R | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/R/type-bare.R b/R/type-bare.R index 48a511708..7524562e4 100644 --- a/R/type-bare.R +++ b/R/type-bare.R @@ -413,7 +413,7 @@ vec_cast.list.list <- function(x, to, ...) { #' @export #' @method vec_cast.list default vec_cast.list.default <- function(x, to, ...) { - if (inherits(x, "vctrs_unspecified")) { + if (is_unspecified(x)) { return(vec_init(to, length(x))) } diff --git a/tests/testthat/test-type-bare.R b/tests/testthat/test-type-bare.R index 7fe3251e9..ef28c71a9 100644 --- a/tests/testthat/test-type-bare.R +++ b/tests/testthat/test-type-bare.R @@ -302,7 +302,7 @@ test_that("can sort raw", { test_that("safe casts work as expected", { expect_equal(vec_cast(NULL, list()), NULL) - expect_equal(vec_cast(NA, list()), list(NA)) + expect_equal(vec_cast(NA, list()), list(NULL)) expect_equal(vec_cast(1:2, list()), list(1L, 2L)) expect_equal(vec_cast(list(1L, 2L), list()), list(1L, 2L)) }) From b675847b06e3b72614abfe9fa169f70ae4097690 Mon Sep 17 00:00:00 2001 From: DavisVaughan Date: Thu, 2 Jan 2020 10:27:52 -0500 Subject: [PATCH 2/3] Replace `NA` values with `NULL` when casting to list --- R/type-bare.R | 5 +++++ tests/testthat/test-type-bare.R | 12 ++++++++++++ 2 files changed, 17 insertions(+) diff --git a/R/type-bare.R b/R/type-bare.R index 7524562e4..5bff9e287 100644 --- a/R/type-bare.R +++ b/R/type-bare.R @@ -419,6 +419,8 @@ vec_cast.list.default <- function(x, to, ...) { out <- lapply(seq_along(x), function(i) x[[i]]) + vec_slice(out, vec_equal_na(x)) <- list(NULL) + if (!is.object(to)) { out <- shape_broadcast(out, to) } @@ -433,6 +435,9 @@ vec_cast.list.data.frame <- function(x, to, ...) { # equivalent for `vec_get()` row.names(x) <- NULL out <- vec_chop(x) + + vec_slice(out, vec_equal_na(x)) <- list(NULL) + out } diff --git a/tests/testthat/test-type-bare.R b/tests/testthat/test-type-bare.R index ef28c71a9..50393e1bb 100644 --- a/tests/testthat/test-type-bare.R +++ b/tests/testthat/test-type-bare.R @@ -320,6 +320,18 @@ test_that("data frames are cast to list row wise (#639)", { expect_equal(vec_cast(x, list()), expect) }) +test_that("Casting atomic `NA` values to list results in a `NULL`", { + x <- c(NA, 1) + expect <- list(NULL, 1) + expect_equal(vec_cast(x, list()), expect) +}) + +test_that("Casting data frame `NA` rows to list results in a `NULL`", { + x <- data.frame(x = c(NA, NA, 1), y = c(NA, 1, 2)) + expect <- list(NULL, vec_slice(x, 2), vec_slice(x, 3)) + expect_equal(vec_cast(x, list()), expect) +}) + # Unspecified test_that("unspecified can be cast to bare methods", { From b25174d60bb07f62a9ab05ac33195848a71c1ac5 Mon Sep 17 00:00:00 2001 From: DavisVaughan Date: Thu, 2 Jan 2020 10:36:20 -0500 Subject: [PATCH 3/3] Ensure that data frames can be cast to shaped lists --- R/type-bare.R | 4 ++++ tests/testthat/test-type-bare.R | 10 ++++++++++ 2 files changed, 14 insertions(+) diff --git a/R/type-bare.R b/R/type-bare.R index 5bff9e287..e8261b125 100644 --- a/R/type-bare.R +++ b/R/type-bare.R @@ -438,6 +438,10 @@ vec_cast.list.data.frame <- function(x, to, ...) { vec_slice(out, vec_equal_na(x)) <- list(NULL) + if (!is.object(to)) { + out <- shape_broadcast(out, to) + } + out } diff --git a/tests/testthat/test-type-bare.R b/tests/testthat/test-type-bare.R index 50393e1bb..4ab6e7aa5 100644 --- a/tests/testthat/test-type-bare.R +++ b/tests/testthat/test-type-bare.R @@ -320,6 +320,16 @@ test_that("data frames are cast to list row wise (#639)", { expect_equal(vec_cast(x, list()), expect) }) +test_that("data frames can be cast to shaped lists", { + to <- array(list(), dim = c(0, 2, 1)) + x <- data.frame(x = 1:2, y = 3:4) + + expect <- list(vec_slice(x, 1), vec_slice(x, 2)) + expect <- array(expect, dim = c(2, 2, 1)) + + expect_equal(vec_cast(x, to), expect) +}) + test_that("Casting atomic `NA` values to list results in a `NULL`", { x <- c(NA, 1) expect <- list(NULL, 1)