Not sure to understand how matrices are displayed

Hi !

At least, since Julia 1.3, still now with Julia 1.6 I did not know how to fix misaligned simple matrices.

julia> A=[45 "m" 6; 4.5 5 't']
2×3 Matrix{Any}:
 45     "m"  6
  4.5  5      't'

This is an issue for my package. Here an abstract:

using Printf

struct MP{T <: Real} <: Real
    λ::T
end

global mpstyle = 2

function Base.show(io::IO, x::MP{T}) where T
    if mpstyle == 0
        show(io, x.λ)
    elseif x.λ == -Inf
        (mpstyle == 1 || mpstyle == 2) ? (@printf io ".") : (@printf io "ε")
    elseif x.λ == zero(T)
        (mpstyle == 1 || mpstyle == 3) ? (@printf io "0") : (@printf io "e")
    elseif x.λ == trunc(x.λ)
        (@printf io "%d" x.λ)
    else
        show(io, x.λ)
    end
end

will display:

julia> mpstyle = 2;

julia> [MP(-Inf) MP(0); MP(0) MP(-Inf)]
2×2 Matrix{MP}:
 .  e
 e  .

julia> mpstyle = 1;

julia> [MP(-Inf) MP(0); MP(0) MP(-Inf)]
2×2 Matrix{MP}:
  .  0
 0    .

julia> mpstyle = 4;

julia> [MP(-Inf) MP(0); MP(0) MP(-Inf)]
2×2 Matrix{MP}:
 ε    e
  e  ε

How to fix my show() function to fix misalignment ?

Thanks !

You can use PrettyTables.jl:

using PrettyTables

showpt(A) = pretty_table(A, tf = tf_borderless, noheader = true)

A = [45 "m" 6; 4.5 5 't']

julia> showpt(A)
   45   m   6
  4.5   5   t
6 Likes

Thank you that works for me ! But do you think I should report an error on their GitHub ?

It is beyond my level to answer, but in any event it should not hurt if you report said behaviour.
Just in case, pointing to the section of the manual that addresses this pretty-printing matter.

Thanks for the link ! Last question. I tried without success to force using the show() function for Array. The old show is still used. How to make it implicit ?

const ArrMP{T,N}  = Array{MP{T},N}

julia> function Base.show(io::IO, A::ArrMP{T}) where T
    pretty_table(A, tf = tf_borderless, noheader = true)
end

mpstyle = 4;

# Not calling show for array
julia> A = [MP(-Inf) MP(0.0); MP(0.0) MP(-Inf)]
2×2 Matrix{MP{Float64}}:
 ε    e
  e  ε

julia> show(stdout, A)
  ε   e
  e   ε

Edit: this code is erroneous. See my next comment for correct code.

1 Like

Please check this SO post out, it provides additional information on this topic.

1 Like

@rafael.guerra Hi ! In fact, I failed to copy/paste my last example from my project, that is why I missed the MIME.

I finally found my last bug. Thank you, it seems to work correctly now ! I can closed this ticket. Here is the final code (I added _ and # to debug which function is called) :

using Printf, PrettyTables

struct MP <: Real
    λ::Float64
end

global mpstyle = 2;

function Base.show(io::IO, x::MP)
    (@printf io "_")
    if x.λ == -Inf
        (mpstyle == 1 || mpstyle == 2) ? (@printf io ".") : (@printf io "ε")
    elseif x.λ == zero(Float64)
        (mpstyle == 1 || mpstyle == 3) ? (@printf io "0") : (@printf io "e")
    elseif x.λ == trunc(x.λ)
        (@printf io "%d" x.λ)
    else
        show(io, x.λ)
    end
end

function Base.show(io::IO, ::MIME"text/plain", x::MP)
    (@printf io "#")
    if x.λ == -Inf
        (mpstyle == 1 || mpstyle == 2) ? (@printf io ".") : (@printf io "ε")
    elseif x.λ == zero(Float64)
        (mpstyle == 1 || mpstyle == 3) ? (@printf io "0") : (@printf io "e")
    elseif x.λ == trunc(x.λ)
        (@printf io "%d" x.λ)
    else
        show(io, x.λ)
    end
end

function Base.show(io::IO, ::MIME"text/plain", A::Array{MP})
    pretty_table(io, A, tf = tf_borderless, noheader = true)
end

And the test:

julia> mpstyle = 2;

julia> A = [MP(-Inf) MP(0.0); MP(5.0) MP(-Inf)]
  _.   _e
  _5   _.


julia> mpstyle = 4;

julia> A = [MP(-Inf) MP(5.5); MP(0.0) MP(-Inf)]
  _ε   _5.5
  _e     _ε

julia> MP(1)
#1

For Matrix:

  • the REPL is calling the display() function
  • which calls the Base.show(io::IO, ::MIME"text/plain", A::Array{MP})
  • which calls the pretty_table
  • which calls the Base.show(io::IO, x::MP)

@rafael.guerra can you confirm that pretty_table cannot use the io::IO passed as parameter ?

1 Like

@Lecrapouille, please look at PrettyTables.jl usage here.

1 Like

Arf ! My bad I was trying to pass it as kwargs. I fixed my example !

1 Like