r-lib / vctrs

Generic programming with typed R vectors

Home Page:https://vctrs.r-lib.org

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

`vec_slice()` errors in conjunction with `data.table::data.table()`, `lubridate::period()` and `rbind()`

Henning-Lenz opened this issue · comments

vctrs package (version 0.6.5 on R 4.3.2) told me to report, so I obey. MWE:

measurements <- data.table::data.table(
  "id" = seq(1, 10),
  "someperiod" = rep(lubridate::period(5), 10)
)

allmeasurements <- rbind(measurements, measurements)

test <- dplyr::arrange(allmeasurements, id)
#> Error in `vec_slice()`:
#> ! Column `someperiod` (size 10) must match the data frame (size 20).
#> ℹ In file 'slice.c' at line 188.
#> ℹ This is an internal error that was detected in the vctrs package.
#>   Please report it at <https://github.com/r-lib/vctrs/issues> with a reprex (<https://tidyverse.org/help/>) and the full backtrace.
#> Backtrace:
#>      ▆
#>   1. ├─dplyr::arrange(allmeasurements, id)
#>   2. ├─dplyr:::arrange.data.frame(allmeasurements, id)
#>   3. │ ├─dplyr::dplyr_row_slice(.data, loc)
#>   4. │ └─dplyr:::dplyr_row_slice.data.frame(.data, loc)
#>   5. │   ├─dplyr::dplyr_reconstruct(vec_slice(data, i), data)
#>   6. │   │ └─dplyr:::dplyr_new_data_frame(data)
#>   7. │   │   ├─row.names %||% .row_names_info(x, type = 0L)
#>   8. │   │   └─base::.row_names_info(x, type = 0L)
#>   9. │   └─vctrs::vec_slice(data, i)
#>  10. └─rlang:::stop_internal_c_lib(...)
#>  11.   └─rlang::abort(message, call = call, .internal = TRUE, .frame = frame)

Created on 2023-12-22 with reprex v2.0.2

While constructing the MWE I found, that it is crucial to

  • use data.table::data.table() as tibble::tibble() and data.frame() work fine
  • use some lubridate::period() because plain integers work and lubridate::duration() work, too

Converting to tibble or data.frame before (but not after) using rbind() produces no error.

So it needs a very special combination of objects to be problematic and perhaps therefore it's originally caused by one of the other packages.

Looks like rbind.data.table doesn't combine Period columns the same way rbind.data.frame / the Period method of c would, combining the vectors in the object's attributes. This prevents you from subsetting with [.data.table too, e.g. allmeasurements[1,] errors.

data.table issue:
Rdatatable/data.table#1454