为什么 SubString Vector 的一个元素不能被测试为条件评估 if (Julia)?

Why one element of SubString Vector can not be tested into conditional evaluation if (Julia)?

我想创建一个函数,首先,它在 Julia 中过滤数据框的一个元素。其次,它测试元素是否“缺失”。如果答案是否定的,它 return 值“0.0”。我的问题是控制评估“if”不起作用,我不知道为什么。如果元素是“String”,则控件评估有效,但是,元素是 1 元素 Vector{SubString{String}}:过滤后;因此,控制评估不起作用。我想知道为什么并且可以将向量元素转换为字符串对象。 注意:"isequal", '==', '===' 也不起作用。

例如:

example_ped = DataFrame(animal = collect(1:1:11),
                    sire = [fill(0,5); fill(4,3); fill(5,3)],
                    dam = [fill(0,4); fill(2,4); fill(3,3)])
CSV.write("ped_example.txt",example_ped, header=true,delim='\t')
pedi = CSV.read("ped_example.txt",delim = '\t', header=true, missingstrings=["0"], DataFrame)
pedi[!,1]=strip.(string.(pedi[!,1]))
pedi[!,2]=strip.(string.(pedi[!,2]))
pedi[!,3]=strip.(string.(pedi[!,3]))

部分功能

function computAddRel!(ped,animal_1,animal_2)
elder,recent = animal_1 < animal_2 ? (animal_1,animal_2) : (animal_2,animal_1)
sireOfrecent = ped.sire[ped.animal.==recent]
damOfrecent  = ped[ped.animal.==recent,"dam"]
if elder==recent
    f_inbreed = (sireOfrecent=="missing" || damOfrecent=="missing") ? 0.0 : 0.5*computAddRel!(ped,sireOfrecent,damOfrecent)
    adiv = 1.0 + f_inbreed
    return adiv
end
end

如果 animal_1 和 animal_2 等于 5

julia>     sireOfrecent = pedi.sire[pedi.animal.==recent]
1-element Vector{Union{Missing, Int64}}:
 missing

然而,对照评价是假的

julia> sireOfrecent=="missing"
false
julia> isequal(sireOfrecent,"missing")
false

提前感谢您的宝贵时间。

你应该写:

ismissing(only(sireOfrecent))

这个的意思:

  • only 检查你是否恰好选择了一行(如果没有 - 你会得到一个错误,因为那会出现歧义;如果是 - 你从数组中提取元素)
  • ismissing 是您应该用来检查某个值是否为 missing.
  • 的函数

这里有一些例子:

julia> x = [missing]
1-element Vector{Missing}:
 missing

julia> only(x)
missing

julia> ismissing(only(x))
true

julia> only([1, 2])
ERROR: ArgumentError: Collection has multiple elements, must contain exactly 1 element

julia> ismissing(only([1]))
false