Giter Club home page Giter Club logo

Comments (3)

nickresnick avatar nickresnick commented on June 1, 2024

posting the ever annoying "+1" here. Would it be great to have for things like modified dplyr::coalesce for factors.

from funs.

DavisVaughan avatar DavisVaughan commented on June 1, 2024

Was thinking about vec_coalesce() today so I figured I'd add this in

If we don't like using the common type and common size, then I think the signature should be vec_coalesce(x, ...) to indicate that we are using the size/type of x.

This is one place it would be nice for vec_slice <- to know how to not recycle length 1 inputs and instead use them repeatedly

library(rlang)
library(vctrs)

vec_coalesce <- function(..., .ptype = NULL) {
  args <- list2(...)
  
  n_args <- vec_size(args) 
  
  if (n_args == 0L) {
    return(NULL)
  }
  
  if (n_args == 1L) {
    out <- args[[1L]]
    return(out)
  }
  
  args <- vec_cast_common(!!! args, .to = .ptype)
  args <- vec_recycle_common(!!! args)
  
  out <- args[[1L]]
  args <- args[-1L]
  
  for (arg in args) {
    is_na <- vec_equal_na(out)
    
    if (!any(is_na)) {
      break
    }
    
    vec_slice(out, is_na) <- vec_slice(arg, is_na)
  }
  
  out
}

vec_coalesce()
#> NULL

vec_coalesce(1, 0)
#> [1] 1

vec_coalesce(1, FALSE, .ptype = logical())
#> [1] TRUE

vec_coalesce(NA, 1)
#> [1] 1

vec_coalesce(c(1, NA, 2), 0L)
#> [1] 1 0 2

vec_coalesce(
  data.frame(x = c(1, NA, 3)), 
  data.frame(x = 2)
)
#>   x
#> 1 1
#> 2 2
#> 3 3

# a bit odd, but this technically makes sense
vec_coalesce(
  data.frame(x = c(1, NA)), 
  data.frame(x = 2, y = 3)
)
#>   x  y
#> 1 1 NA
#> 2 2  3

vec_coalesce(
  factor(c("x", "y", NA, "x", NA)),
  factor("MISSING!")
)
#> [1] x        y        MISSING! x        MISSING!
#> Levels: x y MISSING!

# Common size is used as the reference
vec_coalesce(
  1,
  c(1, 2, 3)
)
#> [1] 1 1 1

vec_coalesce(
  NA,
  c(1, 2, 3)
)
#> [1] 1 2 3

from funs.

hadley avatar hadley commented on June 1, 2024

I think this is just #15? No one has supplied any examples so it's hard to know.

from funs.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.