Julia中缺少值的类型,如NA_real_

Julia中缺少值的类型,如NA_real_,julia,Julia,我无法指定丢失数据的类型 Julia提供了在统计意义上表示缺失值的支持,即在观测值中变量没有可用值,但理论上存在有效值的情况下 根据上面从Julia手册复制的描述,我希望我可以创建不同类型的缺少的对象。我遇到以下错误: missing::Real ERROR: TypeError: in typeassert, expected Real, got Missing 对象类型是与缺失一起携带的有用信息,我需要在单独的变量中携带它吗?有一个单一类型Missing,它唯一的实例是valueMissi

我无法指定丢失数据的类型

Julia提供了在统计意义上表示缺失值的支持,即在观测值中变量没有可用值,但理论上存在有效值的情况下

根据上面从Julia手册复制的描述,我希望我可以创建不同类型的
缺少的
对象。我遇到以下错误:

missing::Real
ERROR: TypeError: in typeassert, expected Real, got Missing

对象类型是与缺失一起携带的有用信息,我需要在单独的变量中携带它吗?

有一个单一类型
Missing
,它唯一的实例是value
Missing
,表示Julia中缺失的值。因此,与R相反,float、logical等类型的缺失没有区别

这种设计的原因是,在Julia中,您可以定义自己的类型,因此不可能像R中那样列出所有可能的缺失类型

您可以通过以下方式进行检查:

julia> missing isa Missing
true

julia> supertype(Missing)
Any
通常,允许缺少值的集合的元素类型为
Union{missing,Actual\u type\u You\u Want}
,例如:

julia> [1, 2, missing]
3-element Array{Union{Missing, Int64},1}:
 1
 2
  missing

julia> Dict(1=>1, 2=>missing)
Dict{Int64,Union{Missing, Int64}} with 2 entries:
  2 => missing
  1 => 1
从理论上讲,可以定义一个参数类型
Missing{T}
,该类型将携带类型
T
信息,但在实践中使用起来并不十分方便,因为这样您就必须为每种类型的缺失值使用单独的语法,现在写
缺失的
就足够了,你就有你想要的了


请注意,这正是大多数R用户在编写
NA
时所做的操作,它是逻辑类型,并且在放入集合类型之后在引擎盖下进行转换。根据我的经验,你可以在实际的R代码中看到
NA_real\uuu
和类似的代码。有一个单例类型
Missing
,它唯一的实例是value
Missing
,表示Julia中缺少的值。因此,与R相反,float、logical等类型的缺失没有区别

这种设计的原因是,在Julia中,您可以定义自己的类型,因此不可能像R中那样列出所有可能的缺失类型

您可以通过以下方式进行检查:

julia> missing isa Missing
true

julia> supertype(Missing)
Any
通常,允许缺少值的集合的元素类型为
Union{missing,Actual\u type\u You\u Want}
,例如:

julia> [1, 2, missing]
3-element Array{Union{Missing, Int64},1}:
 1
 2
  missing

julia> Dict(1=>1, 2=>missing)
Dict{Int64,Union{Missing, Int64}} with 2 entries:
  2 => missing
  1 => 1
从理论上讲,可以定义一个参数类型
Missing{T}
,该类型将携带类型
T
信息,但在实践中使用起来并不十分方便,因为这样您就必须为每种类型的缺失值使用单独的语法,现在写
缺失的
就足够了,你就有你想要的了


请注意,这正是大多数R用户在编写
NA
时所做的操作,它是逻辑类型,并且在放入集合类型之后在引擎盖下进行转换。根据我的经验,你可以在实际的R代码中看到
NA_real\uuu
和非常罕见的类似内容。

Dzieki以获取详细解释。我同意NA_type_uu在R中很少使用,尽管在我看来应该更经常使用。在Julia中,我希望类型更加重要,因为如果我声明函数的输出
f()::Real=…
,我无法从中返回
缺失的
。在Julia中严格类型是一种很好的做法(出于性能原因)。同意-声明类型是一种很好的做法,也是我为什么使用Julia的一个重要原因。在这种情况下,可以将返回类型定义为
f()::Union{Real,Missing}
。将来可能会为此引入一些语法糖,很可能是
Real?
或类似的东西。此外,您甚至可以编写
const RealMissing=Union{Real,Missing}
,以避免现在就编写
Union
。最后请注意,像
f()::T
这样的类型断言首先尝试将
f()
的返回值转换为
T
,因此实际上更像是将其转换为
T
。例如,函数'g(x)::Float64=x`当调用
g(1)
时将返回
1.0
。保持类型稳定和注释类型是两回事。我的代码在没有任何类型注释的情况下可以实现完美的类型稳定和快速。因此,我不认为显式返回类型注释通常是好的做法。您不需要类型注释来保证类型的稳定性,但它们对于捕获bug很有用。还有一些函数无法使类型稳定,您仍然希望确保它们返回正确的类型,以便类型不稳定性不会传播(这是有时发生的情况,例如,当您使用不提供列类型稳定性的DataFrames.jl时)。当然这是可选的。请参见Dzieki的详细说明。我同意NA_type_uu在R中很少使用,尽管在我看来应该更经常使用。在Julia中,我希望类型更加重要,因为如果我声明函数的输出
f()::Real=…
,我无法从中返回
缺失的
。在Julia中严格类型是一种很好的做法(出于性能原因)。同意-声明类型是一种很好的做法,也是我为什么使用Julia的一个重要原因。在这种情况下,可以将返回类型定义为
f()::Union{Real,Missing}
。将来可能会为此引入一些语法糖,很可能是
Real?
或类似的东西。此外,您甚至可以编写
const RealMissing=Union{Real,Missing}
,以避免现在就编写
Union
。最后请注意,像
f()::T
这样的类型断言首先尝试将
f()
的返回值转换为
T
,因此实际上更像是将其转换为
T
。例如,函数'g(x)::Float64=x`当调用
g(1)
时将返回
1.0
。保持类型稳定和注释类型是两回事。我的代码在没有任何类型注释的情况下可以实现完美的类型稳定和快速。所以