diff --git a/Project.toml b/Project.toml index f6f166b..d03f1ae 100644 --- a/Project.toml +++ b/Project.toml @@ -14,11 +14,11 @@ StructC14N = "d2514e9c-36c4-5b8e-97e2-51e7675c221c" Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" [compat] -ColorSchemes = "^3.5" -ColorTypes = "^0.10" +ColorSchemes = "^3.12" +ColorTypes = "^0.11" Colors = "^0.12" DataStructures = "^0.18" ReplMaker = "^0.2" StatsBase = "^0.33" StructC14N = "^0.3" -julia = "^1.2" +julia = "^1.5" diff --git a/src/Gnuplot.jl b/src/Gnuplot.jl index 8650d59..335ee6b 100644 --- a/src/Gnuplot.jl +++ b/src/Gnuplot.jl @@ -1112,11 +1112,8 @@ function parseArguments(_args...) end insert!(args, pos, string(strip(arg[1])) => nothing) elseif isa(arg, AbstractArray) && # ==> a dataset column - ((valtype(arg) <: Real) || - (valtype(arg) <: AbstractString)) ; - elseif isa(arg, AbstractArray) && # ==> a dataset column (to be `convert`ed) - ((typeof(arg[1]) <: Real) || - (typeof(arg[1]) <: AbstractString)) + ((nonmissingtype(eltype(arg)) <: Real) || + (nonmissingtype(eltype(arg)) <: AbstractString)) ; elseif isa(arg, Real) # ==> a dataset column with only one row args[pos] = [arg] elseif isa(arg, Dataset) ; # ==> a Dataset object @@ -1138,54 +1135,54 @@ function parseArguments(_args...) pos += 1 end - # Third pass: convert data into Dataset objetcs + # Third pass: convert data into Dataset objects pos = 1 + accum = Vector{AbstractArray}() while pos <= length(args) arg = args[pos] + taken = false - if isa(arg, AbstractArray) && - !(valtype(arg) <: Real) && - !(valtype(arg) <: AbstractString) + if isa(arg, AbstractArray) + if nonmissingtype(eltype(arg)) != eltype(arg) + @assert nonmissingtype(eltype(arg)) <: AbstractFloat "Missing values are supported only on arrays of floats" + arg[ismissing.(arg)] .= NaN + arg = convert(Array{nonmissingtype(eltype(arg))}, arg) + end + tt = eltype(arg) - # Try with `convert` - if typeof(arg[1]) <: Integer + # Try to convert into Int, Float64 and String + if (tt <: Integer) && !(tt <: Int) arg = convert(Array{Int}, arg) - elseif typeof(arg[1]) <: Real + elseif (tt <: Real) && !(tt <: Float64) arg = convert(Array{Float64}, arg) - elseif typeof(arg[1]) <: AbstractString + elseif (tt <: AbstractString) && !(tt <: String) arg = convert(Array{String}, arg) end - end - if isa(arg, AbstractArray) && # ==> beginning of a dataset - ((valtype(arg) <: Real) || - (valtype(arg) <: AbstractString)) - - # Collect all data - accum = Vector{AbstractArray}() - while isa(arg, AbstractArray) && - ((valtype(arg) <: Real) || - (valtype(arg) <: AbstractString)) + tt = eltype(arg) + if (tt <: Real) || + (tt <: AbstractString) push!(accum, arg) deleteat!(args, pos) - if pos <= length(args) - arg = args[pos] + taken = true + end + end + + if !taken || (pos > length(args)) + if length(accum) > 0 + mm = extrema(length.(accum)) + if mm[1] == 0 # empty Dataset + @assert mm[1] == mm[2] "At least one input array is empty, while other(s) are not" + d = DatasetEmpty() else - break + d = Dataset(accum) end + insert!(args, pos, d) + empty!(accum) end - mm = extrema(length.(accum)) - if mm[1] == 0 - # empty Dataset - @assert mm[1] == mm[2] "At least one input array is empty, while other(s) are not" - d = DatasetEmpty() - else - d = Dataset(accum) - end - insert!(args, pos, d) + pos += 1 end - pos += 1 end # Fourth pass: collect PlotElement objects