Skip to content

Instantly share code, notes, and snippets.

@EmilHvitfeldt
Created April 11, 2024 20:18
Show Gist options
  • Save EmilHvitfeldt/854f86e0e8a754f8ccfb14e2790920a2 to your computer and use it in GitHub Desktop.
Save EmilHvitfeldt/854f86e0e8a754f8ccfb14e2790920a2 to your computer and use it in GitHub Desktop.
sparsevctrs hurdle
library(sparsevctrs)
library(vctrs)

sparse_vector()
#> <sparse_vector[0]>

vec_ptype2.sparse_vector.sparse_vector <- function(x, y, ...) sparse_vector()

vec_ptype2.sparse_vector.double <- function(x, y, ...) double()
vec_ptype2.double.sparse_vector <- function(x, y, ...) double()

vec_ptype2.sparse_vector.integer <- function(x, y, ...) integer()
vec_ptype2.integer.sparse_vector <- function(x, y, ...) integer()

vec_ptype2(sparse_vector(), sparse_vector())
#> <sparse_vector[0]>

vec_cast.sparse_vector.double <- function(x, to, ...) {
  new_sparse_vector(x, seq_along(x), length(x))
}
vec_cast.double.sparse_vector <- function(x, to, ...) {
  res <- double(length(x))
  res[sparsevctrs:::.positions(x)] <- sparsevctrs:::.values(x)
  res
}
vec_cast.sparse_vector.sparse_vector <- function(x, to, ...) {
  x
}

vec_cast(sparse_vector(1, 4, 6), double())
#> [1] 0 0 0 1 0 0
vec_cast(c(6, 4, 7 ,3), sparse_vector())
#> <sparse_vector[4]>
#> [1] 6 4 7 3

vec_c(sparse_vector(1, 4, 6), sparse_vector(1, 4, 6))
#> <sparse_vector[12]>
#>  [1] 0 0 0 0 0 0 0 0 0 0 0 0

vec_proxy.sparse_vector <- function(x, ...) {
  x
}

vec_restore.sparse_vector <- function(x, to, ...) {
  x
}

sparse_vector(1, 4, 6)[1:3]
#> [1] 1 2 3

sparse_vector(1, 4, 6)[2:5]
#> [1] 2 3 4 5
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment