From 9b867292b5e61632aba03bf433cd06bc317f0659 Mon Sep 17 00:00:00 2001 From: venom1204 Date: Wed, 25 Jun 2025 23:10:09 +0000 Subject: [PATCH 1/7] added get0 --- R/data.table.R | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/R/data.table.R b/R/data.table.R index 99ff76109c..867634a7c3 100644 --- a/R/data.table.R +++ b/R/data.table.R @@ -2982,7 +2982,7 @@ setDT = function(x, keep.rownames=FALSE, key=NULL, check.names=FALSE) { } else if (.is_simple_extraction(name)) { # common case is call from 'lapply()' .reassign_extracted_table(name, x) - } else if (name %iscall% "get") { # #6725 + } else if (name %iscall% c("get", "get0")) { # #6725 # edit 'get(nm, env)' call to be 'assign(nm, x, envir=env)' name = match.call(get, name) name[[1L]] = quote(assign) From 35a0a26119c42f0ffee9878dc47691e07c927dd6 Mon Sep 17 00:00:00 2001 From: venom1204 Date: Thu, 26 Jun 2025 20:02:05 +0000 Subject: [PATCH 2/7] added test and the news --- NEWS.md | 2 ++ inst/tests/tests.Rraw | 8 ++++++++ 2 files changed, 10 insertions(+) diff --git a/NEWS.md b/NEWS.md index 64273e5acf..6cc18557e8 100644 --- a/NEWS.md +++ b/NEWS.md @@ -198,6 +198,8 @@ rowwiseDT( 20. Fixed a memory issue causing segfaults in `forder`, [#6797](https://github.com/Rdatatable/data.table/issues/6797). Thanks @dkutner for the report and @MichaelChirico for the fix. +21. `setDT(get0('var'))` now correctly modifies `var` by reference, consistent with the long-standing behavior of `setDT(get('var'))`. Previously, the `.internal.selfref` attribute was not set, [#6864](https://github.com/Rdatatable/data.table/issues/6864). Thanks to @rikivillalba for the report and @venom1204 for the fix. + ### NOTES 1. There is a new vignette on joins! See `vignette("datatable-joins")`. Thanks to Angel Feliz for authoring it! Feedback welcome. This vignette has been highly requested since 2017: [#2181](https://github.com/Rdatatable/data.table/issues/2181). diff --git a/inst/tests/tests.Rraw b/inst/tests/tests.Rraw index e920724647..fe7014ad15 100644 --- a/inst/tests/tests.Rraw +++ b/inst/tests/tests.Rraw @@ -21183,3 +21183,11 @@ test(2317.6, DT1[DF1, on='a', .(d = x.a + i.d)]$d, 5) test(2317.7, DT1[DF2, on='a', e := i.e]$e, 5) test(2317.8, DT1[DF2, on='a', e2 := x.a + i.e]$e2, 6) test(2317.9, DT1[DF2, on='a', .(e = x.a + i.e)]$e, 6) + +#6864 +ds = copy(datasets::iris) +x = setDT(get("ds")) +test(2319.1, !is.null(attr(ds, ".internal.selfref"))) +x = setDT(get0("ds")) +test(2319.2, !is.null(attr(ds, ".internal.selfref"))) +test(2319.3, identical(ds, x)) From 45b2bac07464dbe86972b0a7bea086216a409d3e Mon Sep 17 00:00:00 2001 From: venom1204 Date: Thu, 26 Jun 2025 20:05:28 +0000 Subject: [PATCH 3/7] tests --- inst/tests/tests.Rraw | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/inst/tests/tests.Rraw b/inst/tests/tests.Rraw index fe7014ad15..10c496498b 100644 --- a/inst/tests/tests.Rraw +++ b/inst/tests/tests.Rraw @@ -21185,9 +21185,12 @@ test(2317.8, DT1[DF2, on='a', e2 := x.a + i.e]$e2, 6) test(2317.9, DT1[DF2, on='a', .(e = x.a + i.e)]$e, 6) #6864 -ds = copy(datasets::iris) -x = setDT(get("ds")) -test(2319.1, !is.null(attr(ds, ".internal.selfref"))) -x = setDT(get0("ds")) -test(2319.2, !is.null(attr(ds, ".internal.selfref"))) -test(2319.3, identical(ds, x)) +# issue #6864, test that setDT(get0(...)) preserves .internal.selfref with a simple dataset +dt = data.frame(a = 1:3, b = letters[1:3]) +ds_get = copy(dt) +x_get = setDT(get("ds_get")) +test(2319.1, !is.null(attr(ds_get, ".internal.selfref"))) +ds_get0 = copy(dt) +x_get0 = setDT(get0("ds_get0")) +test(2319.2, !is.null(attr(ds_get0, ".internal.selfref"))) +test(2319.3, identical(ds_get0, x_get0)) From 0e1b2b7b484fad9cc4e5d8688f9f9a0acc58ed18 Mon Sep 17 00:00:00 2001 From: Michael Chirico Date: Thu, 26 Jun 2025 15:20:20 -0700 Subject: [PATCH 4/7] don't reference internal attribute --- NEWS.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NEWS.md b/NEWS.md index 6cc18557e8..62b19f5d33 100644 --- a/NEWS.md +++ b/NEWS.md @@ -198,7 +198,7 @@ rowwiseDT( 20. Fixed a memory issue causing segfaults in `forder`, [#6797](https://github.com/Rdatatable/data.table/issues/6797). Thanks @dkutner for the report and @MichaelChirico for the fix. -21. `setDT(get0('var'))` now correctly modifies `var` by reference, consistent with the long-standing behavior of `setDT(get('var'))`. Previously, the `.internal.selfref` attribute was not set, [#6864](https://github.com/Rdatatable/data.table/issues/6864). Thanks to @rikivillalba for the report and @venom1204 for the fix. +21. `setDT(get0('var'))` now correctly modifies `var` by reference, consistent with the long-standing behavior of `setDT(get('var'))`, [#6864](https://github.com/Rdatatable/data.table/issues/6864). Thanks to @rikivillalba for the report and @venom1204 for the fix. ### NOTES From 8f35daa9a6aae5eca576031a481ee22713281dd6 Mon Sep 17 00:00:00 2001 From: venom1204 Date: Fri, 27 Jun 2025 04:10:36 +0530 Subject: [PATCH 5/7] Update tests.Rraw --- inst/tests/tests.Rraw | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/inst/tests/tests.Rraw b/inst/tests/tests.Rraw index 10c496498b..28bb28369c 100644 --- a/inst/tests/tests.Rraw +++ b/inst/tests/tests.Rraw @@ -21185,12 +21185,12 @@ test(2317.8, DT1[DF2, on='a', e2 := x.a + i.e]$e2, 6) test(2317.9, DT1[DF2, on='a', .(e = x.a + i.e)]$e, 6) #6864 -# issue #6864, test that setDT(get0(...)) preserves .internal.selfref with a simple dataset dt = data.frame(a = 1:3, b = letters[1:3]) -ds_get = copy(dt) -x_get = setDT(get("ds_get")) -test(2319.1, !is.null(attr(ds_get, ".internal.selfref"))) -ds_get0 = copy(dt) -x_get0 = setDT(get0("ds_get0")) -test(2319.2, !is.null(attr(ds_get0, ".internal.selfref"))) -test(2319.3, identical(ds_get0, x_get0)) +dt_get = copy(dt) +setDT(get("dt_get")) +test(2319.1, !is.null(attr(dt_get, ".internal.selfref"))) + +dt_get0 = copy(dt) +setDT(get0("dt_get0")) +test(2319.2, !is.null(attr(dt_get0, ".internal.selfref"))) +test(2319.3, dt_get, dt_get0) From 2de4912dc9d440c45256e625570385dc338cd4ac Mon Sep 17 00:00:00 2001 From: venom1204 Date: Fri, 27 Jun 2025 04:16:04 +0530 Subject: [PATCH 6/7] removed test --- inst/tests/tests.Rraw | 1 - 1 file changed, 1 deletion(-) diff --git a/inst/tests/tests.Rraw b/inst/tests/tests.Rraw index 28bb28369c..e426e0b74e 100644 --- a/inst/tests/tests.Rraw +++ b/inst/tests/tests.Rraw @@ -21193,4 +21193,3 @@ test(2319.1, !is.null(attr(dt_get, ".internal.selfref"))) dt_get0 = copy(dt) setDT(get0("dt_get0")) test(2319.2, !is.null(attr(dt_get0, ".internal.selfref"))) -test(2319.3, dt_get, dt_get0) From 2a307dfe2d2991ec2b94dd282ccb8349b8133677 Mon Sep 17 00:00:00 2001 From: Michael Chirico Date: Thu, 26 Jun 2025 15:51:16 -0700 Subject: [PATCH 7/7] simplify --- inst/tests/tests.Rraw | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/inst/tests/tests.Rraw b/inst/tests/tests.Rraw index e426e0b74e..a0175738c5 100644 --- a/inst/tests/tests.Rraw +++ b/inst/tests/tests.Rraw @@ -21185,11 +21185,10 @@ test(2317.8, DT1[DF2, on='a', e2 := x.a + i.e]$e2, 6) test(2317.9, DT1[DF2, on='a', .(e = x.a + i.e)]$e, 6) #6864 -dt = data.frame(a = 1:3, b = letters[1:3]) -dt_get = copy(dt) +dt_get = data.frame(a = 1:3, b = letters[1:3]) setDT(get("dt_get")) test(2319.1, !is.null(attr(dt_get, ".internal.selfref"))) -dt_get0 = copy(dt) +dt_get0 = data.frame(a = 1:3, b = letters[1:3]) setDT(get0("dt_get0")) test(2319.2, !is.null(attr(dt_get0, ".internal.selfref")))