Is it true that as.data.table() does a shallow copy?

Open
#3,665 5 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Assessment

Difficulty
4/5
Estimated time
3-5 days
Newbie friendliness
35/100
Issue type
Documentation
Clarity
Mostly clear
Activity status
Stale
Tech stack
r
Domain
data

Research direction

Start with the as.data.table(dt) and copy(mtcars_big) calls in the supplied reprex, comparing the observed aliasing and timing with the package's behavior. Clarify whether the shallow-copy behavior is a supported contract and document the conclusion; done means users can tell whether they may rely on it.

Written by the indexing model from the issue text.

Description

by-reference

It seems that as.data.table(dt) creates a "shallow" copy of its input? The reprex below suggests it does, but is this something that I can rely on?

library(data.table)

# Does it copy?
dt <- data.table(x = 1:3)
dt2 <- as.data.table(dt)
dt[, y := x + 1]
dt
#>    x y
#> 1: 1 2
#> 2: 2 3
#> 3: 3 4
dt2
#>    x
#> 1: 1
#> 2: 2
#> 3: 3


# Is it fast than copy?
mtcars_big <- data.table(mtcars[rep(1:32, each = 1e5), ])

bench::mark(
  copy(mtcars_big),
  as.data.table(mtcars_big),
  check = FALSE
)[1:6]
#> Warning: Some expressions had a GC in every iteration; so filtering is
#> disabled.
#> # A tibble: 2 x 6
#>   expression                     min     mean   median      max `itr/sec`
#>   <chr>                     <bch:tm> <bch:tm> <bch:tm> <bch:tm>     <dbl>
#> 1 copy(mtcars_big)           274.9ms    283ms    283ms    291ms      3.53
#> 2 as.data.table(mtcars_big)   85.3ms    129ms    123ms    183ms      7.77

Created on 2019-06-26 by the reprex package (v0.2.1.9000)

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.