Viele Sprachen haben eine Möglichkeit wie null oder none, um einen nicht existierenden Wert anzugeben.
Weil Julia darauf ausgelegt ist, große Mengen (oft unstrukturierter) Daten zu verarbeiten, gibt es mehrere Formen der Nichtexistenz.
Das übergeordnete Ziel ist, fehlende oder verdächtige Werte zu markieren, sobald sie auftreten, und dann fortzufahren, ohne eine Ausnahme auszulösen.
nothingWenn ein Wert wirklich nicht existiert, wird er durch nothing dargestellt. Das kommt wahrscheinlich am ehesten dem gleich, was C (NULL) oder Python (None) tun würden.
julia> n = nothing
julia> isnothing(n)
true
julia> typeof(n)
Nothing
nothing ist also ein Singleton-Wert vom Typ Nothing, und wir können ihn testen.
Eine häufige Verwendung von nothing ist als Rückgabe(-nicht-)wert für Funktionen, die nur wegen ihrer Seiteneffekte verwendet werden (Ausgabe, Netzwerkkonfiguration oder was auch immer).
missingFür Situationen, in denen ein Wert theoretisch existiert, wir aber nicht wissen, welcher, wird missing verwendet. Wenn zum Beispiel Fahrzeuge gezählt werden, die auf einer Straße fahren, brauchen menschliche Beobachter vielleicht mal eine Pause oder automatische Sensoren fallen aus, aber der Verkehr fließt weiter.
missing ist also ein Platzhalter, der den Menschen warnt, dass er entscheiden muss, wie er mit dieser Lücke in den Daten umgeht.
julia> mv = [1, 2, missing]
3-element Vector{Union{Missing, Int64}}:
1
2
missing
julia> typeof(mv)
Vector{Union{Missing, Int64}} (alias for Array{Union{Missing, Int64}, 1})
julia> ismissing.(mv) # broadcast function, displays as 1 for true, 0 for false
3-element BitVector:
0
0
1
Nur wenige andere Sprachen haben diese Funktion eingebaut, aber enge Entsprechungen sind NA in R oder NULL in SQL.
Der Vektortyp im obigen Beispiel ist auf Union{Missing, Int64} gesetzt, was eine gewisse Ähnlichkeit mit Typen wie Option oder Maybe in anderen Sprachen hat.
Ausdrücke geben standardmäßig missing zurück, wenn missing-Werte vorhanden sind.
Wenn du möchtest, dass diese Werte ignoriert werden, verwende die Funktion skipmissing(), um das ausdrücklich zu machen:
julia> mv = [1, 2, missing]
3-element Vector{Union{Missing, Int64}}:
1
2
missing
julia> sum(mv) # missing in, missing out
missing
julia> skipmissing(mv)
skipmissing(Union{Missing, Int64}[1, 2, missing])
julia> collect(skipmissing(mv))
2-element Vector{Int64}:
1
2
julia> sum(skipmissing(mv)) # functions like sum() can work with iterators
3
Weil skipmissing einen Iterator erzeugt, pack es in collect(), wenn du einen Vektor brauchst.
Manchmal ist es nützlich, missing-Werte durch einen Standardwert zu ersetzen.
Das Makro @coalesce() ist dafür nützlich, denn es gibt den ersten Nicht-missing-Wert zurück (oder missing, wenn es nichts anderes gibt).
julia> str = ["I", "exist", missing]
3-element Vector{Union{Missing, String}}:
"I"
"exist"
missing
julia> [@coalesce(s, "-") for s in str]
3-element Vector{String}:
"I"
"exist"
"-"
NaNKurz für „Not a Number“, NaN markiert ein Berechnungsproblem in Situationen, in denen eine Zahl erwartet wurde.
julia> v = [0, 1, -1]
3-element Vector{Int64}:
0
1
-1
julia> v / 0
3-element Vector{Float64}:
NaN
Inf
-Inf
julia> sum(v / 0)
NaN
Jede Art von Berechnung mit Daten, die ein NaN enthalten, ergibt ein NaN-Ergebnis.
Derzeit gibt es keine spezielle Funktion, um NaN-Werte zu entfernen, aber die Standardfunktion filter() kann das ganz einfach erledigen.
Nur Werte, für die eine gegebene Bedingung true ist, werden in das Ergebnis-Array kopiert:
julia> filter(!isnan, [1, 2, NaN])
2-element Vector{Float64}:
1.0
2.0
Das ist etwas, das du wahrscheinlich seltener verwendest. Ausnahmen sind:
struct) mit nicht initialisierten Feldern zu erstellen.
Julia versucht normalerweise, Standardwerte zu verwenden, kann das aber nur, wenn es genug Informationen hat, um den Feldtyp abzuleiten.undef zu initialisieren.
Das wurde zum Beispiel in Community-Lösungen zur Übung Circular Buffer verwendet (eine fortgeschrittene Technik, aber diese Übung wird als schwer eingestuft).Ein undef-Ergebnis beim Versuch, auf einen Wert zuzugreifen, ist ein Fehlerzustand, der typischerweise mit einem UndefRefError gemeldet wird.