Data.table: setDT doesn't work with magrittr pipe %>%

Created on 3 Dec 2020  路  2Comments  路  Source: Rdatatable/data.table

Example:

library(data.table)
library(magrittr)
d <- data.frame(a=1:2)
d %>% setDT
d[, c:=1:2]

Gives:

Warning message:
In [.data.table(d, , :=(c, 1:2)) :
Invalid .internal.selfref detected and fixed by taking a (shallow) copy of the data.table so that := can add this new column by reference. At an earlier point, this data.table has been copied by R (or was created manually using structure() or similar). Avoid names<- and attr<- which in R currently (and oddly) may copy the whole data.table. Use set* syntax instead to avoid copying: ?set, ?setnames and ?setattr. If this message doesn't help, please report your use case to the data.table issue tracker so the root cause can be fixed or this message improved.

The reason seems to be that in this context, the statement within setDT
assign(name, x, parent.frame(), inherits=TRUE) doesn't behave as expected (one parent.frame() isn't enough).

Perhaps similar to #4830 , not sure.

# Output of sessionInfo()
R version 3.6.1 (2019-07-05)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows 10 x64 (build 19042)

Matrix products: default

locale:
[1] LC_COLLATE=English_United States.1252 LC_CTYPE=English_United States.1252
[3] LC_MONETARY=English_United States.1252 LC_NUMERIC=C
[5] LC_TIME=English_United States.1252

attached base packages:
[1] stats graphics grDevices utils datasets methods base

other attached packages:
[1] magrittr_1.5 data.table_1.13.0

loaded via a namespace (and not attached):
[1] bit_4.0.4 compiler_3.6.1 tools_3.6.1 bit64_4.0.5

Most helpful comment

FWIW I don't get this warning with the native R pipe on R-devel:

d <- data.frame(a=1:2)
d |> setDT()
d[ , c:=1:2]

All 2 comments

I'd suggest taking a look at the tidytable package as it offers a tidyverse like interface to data.table, one thing to note is that just like tidyverse it doesn't modify by reference

FWIW I don't get this warning with the native R pipe on R-devel:

d <- data.frame(a=1:2)
d |> setDT()
d[ , c:=1:2]
Was this page helpful?
0 / 5 - 0 ratings