From 62d82a84626f8a3f155d97d07aaa2247336d5e05 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ma=C3=ABlle=20Salmon?= Date: Thu, 23 May 2024 12:28:54 +0200 Subject: [PATCH 1/3] fix: remove unintended type conversions when using disjoint_union --- R/operators.R | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/R/operators.R b/R/operators.R index 62ecd7c277e..3c238f50a7a 100644 --- a/R/operators.R +++ b/R/operators.R @@ -249,13 +249,17 @@ disjoint_union <- function(...) { noattr <- setdiff(names(attr), names(ea)) # existint and missing newattr <- setdiff(names(ea), names(attr)) # new for (a in seq_along(exattr)) { - attr[[exattr[a]]] <- c(attr[[exattr[a]]], ea[[exattr[a]]]) + attr[[exattr[a]]] <- vctrs::vec_c(attr[[exattr[a]]], ea[[exattr[a]]]) } for (a in seq_along(noattr)) { - attr[[noattr[a]]] <- c(attr[[noattr[a]]], rep(NA, ec[i])) + attr[[noattr[a]]] <- vctrs::vec_c(attr[[noattr[a]]], rep(NA, ec[i])) } for (a in seq_along(newattr)) { - attr[[newattr[a]]] <- c(rep(NA, cumec[i]), ea[[newattr[a]]]) + if (cumec[i] == 0) { + attr[[newattr[a]]] <- ea[[newattr[a]]] + } else { + attr[[newattr[a]]] <- vctrs::vec_c(rep(NA, cumec[i]), ea[[newattr[a]]]) + } } } edge.attributes(res) <- attr From c7a1cf17c465732fe754378ac579b39229e44e7d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ma=C3=ABlle=20Salmon?= Date: Thu, 23 May 2024 13:06:36 +0200 Subject: [PATCH 2/3] test: add test for no type conversion by disjoint_union() --- tests/testthat/test-operators.R | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/tests/testthat/test-operators.R b/tests/testthat/test-operators.R index c70865be312..d4a2301b201 100644 --- a/tests/testthat/test-operators.R +++ b/tests/testthat/test-operators.R @@ -30,6 +30,20 @@ test_that("disjoint_union() works", { ) }) +test_that("disjoint_union() does not convert types", { + # https://github.com/igraph/rigraph/issues/761 + + g1 <- make_graph(~ A - -B) + g2 <- make_graph(~ D - -E) + + g1 <- set_edge_attr(g1, "date", value = as.POSIXct(c("2021-01-01 01:01:01"))) + g2 <- set_edge_attr(g2, "date", value = as.POSIXct(c("2021-03-03 03:03:03"))) + + u <- disjoint_union(g1, g2) + + expect_s3_class(E(u)$date, c("POSIXct", "POSIXt")) +}) + test_that("intersection() works", { g1 <- make_ring(10) From 7e01512fa22bfc29a10984ea1821e370dc05024b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kirill=20M=C3=BCller?= Date: Thu, 20 Jun 2024 10:48:08 +0200 Subject: [PATCH 3/3] Use unspecified() --- R/operators.R | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/R/operators.R b/R/operators.R index 3c238f50a7a..e7f2eb58e2a 100644 --- a/R/operators.R +++ b/R/operators.R @@ -252,14 +252,10 @@ disjoint_union <- function(...) { attr[[exattr[a]]] <- vctrs::vec_c(attr[[exattr[a]]], ea[[exattr[a]]]) } for (a in seq_along(noattr)) { - attr[[noattr[a]]] <- vctrs::vec_c(attr[[noattr[a]]], rep(NA, ec[i])) + attr[[noattr[a]]] <- vctrs::vec_c(attr[[noattr[a]]], vctrs::unspecified(ec[[i]])) } for (a in seq_along(newattr)) { - if (cumec[i] == 0) { - attr[[newattr[a]]] <- ea[[newattr[a]]] - } else { - attr[[newattr[a]]] <- vctrs::vec_c(rep(NA, cumec[i]), ea[[newattr[a]]]) - } + attr[[newattr[a]]] <- vctrs::vec_c(vctrs::unspecified(cumec[[i]]), ea[[newattr[a]]]) } } edge.attributes(res) <- attr