More consistency in handling matrices in j
Nobody has claimed this yet.
Assessment
- Difficulty
- 5/5
- Estimated time
- Over a week
- Newbie friendliness
- 25/100
Research direction
Start by reviewing the behavior described in #6054 and the existing handling in as.data.table.list() and as.data.table(). Compare the grouped and ungrouped matrix examples, first deciding the intended recycling and column-expansion rules; done means the behavior is consistent and the listed cases are covered by tests.
Written by the indexing model from the issue text.
Description
Follow-up to #783 / #6054.
Outside grouping, matrices in j are auto-converted by as.data.table.list() so that entries are OK as long as the dimensions look "right" in the same way that as.data.table() works:
DT=data.table(a=rep(1:2, 3), b=1:6)
DT[, .(cbind(b))] # OK, 1 column output
DT[, .(cbind(b, b))] # OK, 2 columns output
DT[, .(b, cbind(b, b))] # OK, 3 columns output
DT[, .(b[1L], cbind(b, b))] # OK, 3 columns output, length-1 recycling rules
# OK-ish, 3 columns output with warning about uneven recycling, but could be error?
DT[, .(b[-1L], cbind(b, b))]
Note that the case without .(...) in grouping is not interesting, since the return value is always "plain" like what you'd get with with(), i.e. the output need not be a data.table.
Inside grouping, as of #6054, we have this behavior:
DT[, cbind(b), by=a] # OK, 2 columns output
# !! inconsistent with ungrouped case: 2 columns, equivalent to `DT[, .(c(b,b)), by=a]`
# IMO consistency would say this should be DT[, .(b, b), by=a]
DT[, cbind(b, b), by=a]
DT[, .(cbind(b)), by=a] # OK, 2 columns output
# error as of #6054, but for consistency could be DT[, .(b,b), by=a]
DT[, .(cbind(b, b)), by=a]
# error, IMO this implies the last un-grouped case should also be an error -- only singletons are recycled.
DT[, .(1, 1:2, 1:3), by=a]
- 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 ·