为什么 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
我想创建一个函数,首先,它在 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