Inconsistent copy behavior when subsetting

Open
#2,254 0 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Assessment

Difficulty
4/5
Estimated time
3-5 days
Newbie friendliness
45/100
Issue type
Bug
Clarity
Clearly specified
Activity status
Stale
Tech stack
r
Domain
data

Research direction

Reproduce the reported examples using data.table subsetting with dt[TRUE], dt[1L], and dt[cond], comparing the address(x) results before and after selection. Trace the subsetting entry point to determine why copy behavior depends on row count; done means the equivalent subsetting cases consistently copy result columns and the examples no longer diverge.

Written by the indexing model from the issue text.

Description

consistency

When we subset a data.table, it is supposed to copy the resulted columns. However, it seems that whether they are copied depends on the number of rows of the original data.table. Here's an example:

library(data.table)
d1 <- data.table(x = c(0, 1), y = c(1, 0))
d2 <- d1[x >= 0]
d1[, address(x)]
d2[, address(x)]

m1 <- data.table(x = 0, y = 1)
m2 <- m1[x >= 0]
m1[, address(x)]
m2[, address(x)]

The following are the results produced on my machine:

> library(data.table)
data.table 1.10.4
  The fastest way to learn (by data.table authors): https://www.datacamp.com/courses/data-analysis-the-data-table-way
  Documentation: ?data.table, example(data.table) and browseVignettes("data.table")
  Release notes, videos and slides: http://r-datatable.com
> d1 <- data.table(x = c(0, 1), y = c(1, 0))
> d2 <- d1[x >= 0]
> d1[, address(x)]
[1] "0x356b878"
> d2[, address(x)] # copied!
[1] "0x31fbf08"
> m1 <- data.table(x = 0, y = 1)
> m2 <- m1[x >= 0]
> m1[, address(x)]
[1] "0x4331ab8"
> m2[, address(x)] # not copied!
[1] "0x4331ab8"

It looks like dt[TRUE], dt[1L] and dt[cond] are not always consistent in terms of copy behavior even when the results are the same.

My session info:

R version 3.4.1 (2017-06-30)
Platform: x86_64-pc-linux-gnu (64-bit)
Running under: Ubuntu 16.04.2 LTS

Matrix products: default
BLAS: /usr/lib/openblas-base/libblas.so.3
LAPACK: /usr/lib/libopenblasp-r0.2.18.so

locale:
 [1] LC_CTYPE=en_US.UTF-8       LC_NUMERIC=C               LC_TIME=en_US.UTF-8        LC_COLLATE=en_US.UTF-8     LC_MONETARY=en_US.UTF-8    LC_MESSAGES=en_US.UTF-8   
 [7] LC_PAPER=en_US.UTF-8       LC_NAME=C                  LC_ADDRESS=C               LC_TELEPHONE=C             LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C       

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

other attached packages:
[1] data.table_1.10.4

loaded via a namespace (and not attached):
[1] compiler_3.4.1 tools_3.4.1    yaml_2.1.14   
Dominant language
R
Stars
3.9k
Forks
1.1k
Avg merge
14h 4m
Merged PRs (30d)
4

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

More from Rdatatable/data.table

All issues in Rdatatable/data.table

Similar issues

More R issues

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.