Assignment is inconsistent with list
Nobody has claimed this yet.
Assessment
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Newbie friendliness
- 35/100
Research direction
Start by reproducing the single-row and multi-row examples in R, then inspect the linked [ .data.table method in R/data.table.R around lines 1047-1053. Determine the intended coercion for var := .(...) versus :=(var = .(...)); done means the assignment forms behave consistently for equal and non-equal lengths.
Written by the indexing model from the issue text.
Description
Updating a data.table by reference provides inconsistent results for single-row data.tables:
library(data.table) ##1.12.8 - same results in master
dt = data.table(a = 3L)
dt[, b:= 3L]
dt[, b2 := .(3L)]
dt[, `:=`( b3 = 3L)]
dt[, `:=`(b4 = .(3L))]
dt
#> a b b2 b3 b4
#> <int> <int> <int> <int> <list>
#> 1: 3 3 3 3 3
Basically, the var := .(...) version seems to coerce the RHS to an atomic if ... evaluates to an atomic and is the same number of rows as the data.table. This differs from `:=`(var = .(...)) which appears to always make var a list column
dt = data.table(a = c(1L,3L))
dt[, b2 := .(c(2L, 3L))]
dt[, `:=`(b4 = .(c(2L, 3L)))]
dt
## a b2 b4
## <int> <int> <list>
##1: 1 2 2,3
##2: 3 3 2,3
##non-equal lengths
dt = data.table(a = c(1L, 3L, 5))
dt[, b2 := .(c(2L, 3L))]
dt
## a b2
## <num> <list>
##1: 1 2,3
##2: 3 2,3
##3: 5 2,3
I have not had a chance to dig deep, but this line from [.data.table may help explain why `:=`(var = .(...)) results in a list.
This was observed while investigating #4568 although I am not sure how related they are.
- Dominant language
- R
- Stars
- 3.9k
- Forks
- 1.1k
- Avg merge
- 14h 4m
- Merged PRs (30d)
- 4
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
More from Rdatatable/data.table
-
as.data.table() recurses without end on a survival::Surv object (or any data.frame carrying one) Open
Difficulty 2/5 1-3 hours Newbie friendliness 88/100
Rdatatable/data.table#7887 ·
-
consistency tests
Difficulty 2/5 1-3 hours Newbie friendliness 68/100
Rdatatable/data.table#7853 · 3 comments ·
-
internals
Difficulty 2/5 1-3 hours Newbie friendliness 65/100
Rdatatable/data.table#6938 · 1 comment ·
-
encoding fread
Difficulty 2/5 1-3 hours Newbie friendliness 65/100
Rdatatable/data.table#5179 · 8 comments ·
-
documentation programming
Difficulty 2/5 1-3 hours Newbie friendliness 68/100
Rdatatable/data.table#3199 · 3 comments ·
All issues in Rdatatable/data.table
Similar issues
-
Difficulty 2/5 1-3 hours Newbie friendliness 82/100
r-lib/pkgdepends#485 · 3 comments ·
-
Difficulty 1/5 Under an hour Newbie friendliness 92/100
-
beginners blocker
Difficulty 2/5 1-3 hours Newbie friendliness 78/100
-
enviPathR OpenBuild Error Build OK Build Warning policies-accepted pre-review precheck-passed
Difficulty 1/5 Under an hour Newbie friendliness 84/100
Bioconductor/BiocContributions#207 · 6 comments ·
-
Difficulty 2/5 1-3 hours Newbie friendliness 74/100
datacarpentry/semester-biology#1255 ·