setattr() creates a deep copy of the attribute object

Open
#1,218 0 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Assessment

Difficulty
3/5
Estimated time
1-2 days
Newbie friendliness
35/100
Issue type
Bug
Clarity
Mostly clear
Activity status
Stale
Tech stack
r
Domain
data, performance

Research direction

Start with the setattr() entry point and reproduce the address comparisons in the issue using R. Trace how the attribute is assigned, then add coverage showing that the attribute object is not copied while the requested reference behavior is preserved.

Written by the indexing model from the issue text.

Description

by-reference

I recently realized that the setattr function changes the input object by reference (that is, without any copy), however, it copies the attribute object:

library(data.table)
x <- 1
a1 <- "an attribute object which can be a large vector"
orig_addresses <- c(address(x), address(a1))
data.table::setattr(x, "a", a1)
new_addresses <- c(address(x), address(attr(x, "a")))
orig_addresses == new_addresses
# [1] TRUE FALSE

The base solution does exactly the opposite: it copies the input object, but does not copy the attribute object:

library(data.table)
x <- 1
a1 <- "an attribute object which can be a large vector"
orig_addresses <- c(address(x), address(a1))
attr(x, "a") <- a1
new_addresses <- c(address(x), address(attr(x, "a")))
orig_addresses == new_addresses
# [1] FALSE TRUE

The bit package also has a setattr function which does not create any copy:

library(data.table)
library(bit)
x <- 1
a1 <- "an attribute object which can be a large vector"
orig_addresses <- c(address(x), address(a1))
bit::setattr(x, "a", a1)
new_addresses <- c(address(x), address(attr(x, "a")))
orig_addresses == new_addresses
# [1] TRUE TRUE

Would it be possible to the modify the setattr function so that it does not create a copy of the attribute object?


sessionInfo()
R version 3.2.1 (2015-06-18)
Platform: x86_64-pc-linux-gnu (64-bit)
Running under: Linux Mint LMDE

locale:
[1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8
[5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 LC_PAPER=en_US.UTF-8 LC_NAME=C
[9] 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] bit_1.1-12 data.table_1.9.5

loaded via a namespace (and not attached):
[1] tools_3.2.1 chron_2.3-45

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.