【发布时间】:2018-08-21 13:50:17
【问题描述】:
我想创建一个处理缺失值的函数。但是,当我尝试指定缺少的类型 Array{Missing, 1} 时,它会出错。
function f(x::Array{<:Number, 1})
# do something complicated
println("no missings.")
println(sum(x))
end
function f(x::Array{Missing, 1})
x = collect(skipmissing(x))
# do something complicated
println("removed missings.")
f(x)
end
f([2, 3, 5])
f([2, 3, 5, missing])
我知道我的类型不是 Missing 而是 Array{Union{Missing, Int64},1}
当我指定此类型时,它适用于上述情况。但是,我想使用所有类型(字符串、浮点数等,不仅是 Int64)。
我试过了
function f(x::Array{Missing, 1})
...
end
但它又出错了……这么说
f (generic function with 1 method)
ERROR: LoadError: MethodError: no method matching f(::Array{Union{Missing, Int64},1})
Closest candidates are:
f(::Array{Any,1}) at ...
我怎么能说我希望类型与任何东西都成为联合缺失?
编辑(重新制定)
让我们有这 4 个向量和两个处理字符串和数字的函数。
x1 = [1, 2, 3]
x2 = [1, 2, 3, missing]
x3 = ["1", "2", "3"]
x4 = ["1", "2", "3", missing]
function f(x::Array{<:Number,1})
println(sum(x))
end
function f(x::Array{String,1})
println(join(x))
end
f(x) 不适用于 x2 和 x3,因为它们的类型分别为 Array{Union{Missing, Int64},1} 和 Array{Union{Missing, String},1}。
可以只有一个函数来检测向量是否包含缺失,删除它们,然后适当地处理它。
例如:
function f(x::Array{Any, 1})
x = collect(skipmissing(x))
print("removed missings")
f(x)
end
但这不起作用,因为Any 表示混合类型(例如,字符串和数字),并不表示字符串或数字或其他任何内容。
编辑 2 部分修复
这行得通:
function f(x::Array)
x = collect(skipmissing(x))
print("removed missings")
f(x)
end
[但是,那么,如何指定数组的形状(维数)...? (虽然这可能是一个无关的话题)]
【问题讨论】:
标签: function methods julia missing-data dispatch