# X::Vector{Union{Missing, Any}}

**URL:** https://discourse.julialang.org/t/x-vector-union-missing-any/14896
**Category:** New to Julia
**Created:** [September 13, 2018, 6:34am UTC](https://discourse.julialang.org/t/x-vector-union-missing-any/14896 "2018-09-13T06:34:18Z")
**Posts on this page:** 13
**Page:** 1

<div class="post-metadata">

### Author: ![DominiqueMakowski](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/dominiquemakowski/32/51410_2.png) [@DominiqueMakowski](https://discourse.julialang.org/u/DominiqueMakowski)
#### Post date: [September 13, 2018, 6:34am UTC](https://discourse.julialang.org/t/x-vector-union-missing-any/14896/1 "2018-09-13T06:34:18Z")

</div>

I am trying to write a function that would work for any vector containing missings. However, it seems that

`f(X::Vector{Union{Missing, Any}}) = print("hi")`

doesn’t work. Could someone enlight me on how to build functions dealing with missing the Julian way 😄? Thank you

---

<div class="post-metadata">

### Author: ![fredrikekre](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/fredrikekre/32/1688_2.png) [@fredrikekre](https://discourse.julialang.org/u/fredrikekre)
#### Post date: [September 13, 2018, 6:50am UTC](https://discourse.julialang.org/t/x-vector-union-missing-any/14896/2 "2018-09-13T06:50:47Z")

</div>

This does not completely answer your question, but note that

```julia
julia> Union{Missing, Any}
Any

```

and thus

```julia
julia> Vector{Union{Missing, Any}}
Array{Any,1}

```

so your function only accepts objects with type `Array{Any,1}` (`Vector{Any}`). Note also that

```julia
julia> Vector{Int} <: Vector{Any}
false

```

since Julias type parameters are invariant, see relevant manual section: [Types · The Julia Language](https://docs.julialang.org/en/v1/manual/types/#Parametric-Composite-Types-1) and thus

```julia
julia> f(x::Vector{Any}) = println("hi");

julia> f(Any[1, 2]) # typeof(x) == Vector{Any} so this works
hi

julia> f(Int[1, 2]) # typeof(x) == Vector{Int} so this fails
ERROR: MethodError: no method matching f(::Array{Int64,1})

```

---

<div class="post-metadata">

### Author: ![DominiqueMakowski](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/dominiquemakowski/32/51410_2.png) [@DominiqueMakowski](https://discourse.julialang.org/u/DominiqueMakowski)
#### Post date: [September 13, 2018, 6:53am UTC](https://discourse.julialang.org/t/x-vector-union-missing-any/14896/3 "2018-09-13T06:53:29Z")

</div>

I see, so if I undestand correctly, there are no specific type for “missing” that would not be “any”? In other words, “any-with-missing” and “any-without-missing” are not dissociated?

---

<div class="post-metadata">

### Author: ![nalimilan](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/nalimilan/32/147_2.png) [@nalimilan](https://discourse.julialang.org/u/nalimilan)
#### Post date: [September 13, 2018, 4:17pm UTC](https://discourse.julialang.org/t/x-vector-union-missing-any/14896/4 "2018-09-13T16:17:07Z")

</div>

> [@DominiqueMakowski](#):
>
> I see, so if I undestand correctly, there are no specific type for “missing” that would not be “any”? In other words, “any-with-missing” and “any-without-missing” are not dissociated?

Indeed, since (as its name indicates) `Any` can be any value, including `missing`.

In general, use `::AbstractArray{>:Missing}` to define a method which should be called for any array which can contain `missing`. But note that in many cases you can just define a single generic method, knowing that the compiler will (often) optimize out `ismissing(A[i])` calls when the array cannot contain `missing`.

---

<div class="post-metadata">

### Author: ![DominiqueMakowski](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/dominiquemakowski/32/51410_2.png) [@DominiqueMakowski](https://discourse.julialang.org/u/DominiqueMakowski)
#### Post date: [September 13, 2018, 4:54pm UTC](https://discourse.julialang.org/t/x-vector-union-missing-any/14896/5 "2018-09-13T16:54:18Z")

</div>

> [@nalimilan](#):
>
> But note that in many cases you can just define a single generic method, knowing that the compiler will (often) optimize out `ismissing(A[i])` calls when the array cannot contain `missing` .

This aspect of Julia is still a bit unclear to me; currently how I’ve been doing is, for instance, defining one method for vector of numbers:

```julia
function f(X::Vector{<:Number}; n::Int=10)
    X = collect(range(minimum(X), stop=maximum(X), length=n))
end

f([1,6, 4])
f([1,6, missing])

```

(which doesn’t work for the vector containg missing values.)

Thus, I create a second version:

```julia
function f(X::AbstractVector{>:Missing}; n::Int=10)
    X = f(collect(skipmissing(X)), n=n)
end

f([1,6, missing])

```

which removes the missings and performs the function. However, I feel like it’s not the most optimal or Julian way of doing it…

---

<div class="post-metadata">

### Author: ![Per](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/per/32/10387_2.png) [@Per](https://discourse.julialang.org/u/Per)
#### Post date: [September 13, 2018, 5:36pm UTC](https://discourse.julialang.org/t/x-vector-union-missing-any/14896/6 "2018-09-13T17:36:54Z")

</div>

I’d recommend just writing one method:

```julia
function f(X; n::Integer=10)
    X = skipmissing(X)
    return collect(range(minimum(X), stop=maximum(X), length=n))
end

```

---

<div class="post-metadata">

### Author: ![DominiqueMakowski](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/dominiquemakowski/32/51410_2.png) [@DominiqueMakowski](https://discourse.julialang.org/u/DominiqueMakowski)
#### Post date: [September 13, 2018, 5:43pm UTC](https://discourse.julialang.org/t/x-vector-union-missing-any/14896/7 "2018-09-13T17:43:07Z")

</div>

> [@Per](#):
>
> I’d recommend just writing one method:

And not to restrict to Numbers? What if I want the same method doing something else for Strings for instance?

---

<div class="post-metadata">

### Author: ![Per](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/per/32/10387_2.png) [@Per](https://discourse.julialang.org/u/Per)
#### Post date: [September 13, 2018, 5:59pm UTC](https://discourse.julialang.org/t/x-vector-union-missing-any/14896/8 "2018-09-13T17:59:34Z")

</div>

Sure, you can write `f(X::AbstractVector{<:Real}; n::Integer=10)` if you want, but often it is not necessary to specify types. (If you want to do something completely different with strings, then it is possible to do that with a more specific method, but maybe it would be better to create a new function entirely?)

`Number` includes complex numbers, which do not support `maximum` or `minimum`.

On the other hand, if somebody creates a non-number type which supports `maximum`, `minimum` and `range`, then why not allow it in your function?

---

<div class="post-metadata">

### Author: ![rdeits](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/rdeits/32/286_2.png) [@rdeits](https://discourse.julialang.org/u/rdeits)
#### Post date: [September 13, 2018, 6:06pm UTC](https://discourse.julialang.org/t/x-vector-union-missing-any/14896/9 "2018-09-13T18:06:04Z")

</div>

> [@DominiqueMakowski](#):
>
> And not to restrict to Numbers? What if I want the same method doing something else for Strings for instance?

How about this?

```julia
julia> f(x::AbstractVector{<:Union{<:Number, Missing}}) = 1
f (generic function with 1 method)

julia> f([1,2,3])
1

julia> f([1,2,3,missing])
1

julia> f(["hello", "world"])
ERROR: MethodError: no method matching f(::Array{String,1})
Closest candidates are:
  f(::AbstractArray{#s12,1} where #s12<:(Union{Missing, #s13} where #s13<:Number)) at REPL[1]:1
Stacktrace:
 [1] top-level scope at none:0

```

---

<div class="post-metadata">

### Author: ![nalimilan](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/nalimilan/32/147_2.png) [@nalimilan](https://discourse.julialang.org/u/nalimilan)
#### Post date: [September 14, 2018, 7:56am UTC](https://discourse.julialang.org/t/x-vector-union-missing-any/14896/10 "2018-09-14T07:56:56Z")

</div>

`::AbstractVector{<:Union{Number, Missing}}` is the way to go if you want numbers or missing values. But it can also make sense to define two methods instead, depending on what the function does. Note that in the example you provide, the call to `collect` around `skipmissing` isn’t needed since `maximum` accepts any iterable: if you define an internal method which takes any iterable too, and call it from the two public methods, you can avoid that unnecessary allocation.

---

<div class="post-metadata">

### Author: ![DominiqueMakowski](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/dominiquemakowski/32/51410_2.png) [@DominiqueMakowski](https://discourse.julialang.org/u/DominiqueMakowski)
#### Post date: [September 14, 2018, 8:00am UTC](https://discourse.julialang.org/t/x-vector-union-missing-any/14896/11 "2018-09-14T08:00:11Z")

</div>

I think I understand now 🙂

Many thanks for your awesome explanations and clever suggestions, it helps a lot!

---

<div class="post-metadata">

### Author: ![jwu](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/jwu/32/3775_2.png) [@jwu](https://discourse.julialang.org/u/jwu)
#### Post date: [June 25, 2019, 6:46pm UTC](https://discourse.julialang.org/t/x-vector-union-missing-any/14896/12 "2019-06-25T18:46:20Z")

</div>

your solution seems not working, this code returns false in Julia 1.0.4:

```julia
Vector{Float32} <: AbstractVector{Union{Missing, Float32}}

```

---

<div class="post-metadata">

### Author: ![rdeits](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/rdeits/32/286_2.png) [@rdeits](https://discourse.julialang.org/u/rdeits)
#### Post date: [June 25, 2019, 6:56pm UTC](https://discourse.julialang.org/t/x-vector-union-missing-any/14896/13 "2019-06-25T18:56:19Z")

</div>

You need an extra `<:` in there:

```julia
julia> Vector{Float32} <: AbstractVector{<:Union{Missing, Float32}}
true

```
