2017-10-18 6 views
2

空のIndexedTablesを定義できません。Juliaで空のIndexedTablesを定義する方法は?

using IndexedTables, IndexedTables.Table 
t = Table(Columns(a=Int64[],b=String[]),Int64[]) 
t[1,"a"] = 1 
t[1,"b"] = 2 
t[1,"c"] = t[1,"a"] + t[1,"b"] 
BoundsError: attempt to access 0-element Array{Int64,1} at index [0] 

は、私はすでにデータとIndexedTableの作成が空のものを作成し、その後は値を挿入することがより効率的であることを承知していますが、時にはあなたはこのように行くことが義務付けられています。

これはバグですか?もしそうなら、可能な回避策はありますか?

これはおそらくIndexedTablesのバグです

答えて

2

を(私はすでにJulia forumにこのスレッドを掲載、これまでのところ、私はそこに何の返答もなかったです)。

IndexedTableに挿入するには、データにアクセスするためにインデックスを再作成する必要があります。再インデックスはflush!で行われます。

しかし、という質問の例では、flush!(t)は失敗します。変更が最初ifにおけるlength(...)チェックの追加である

julia> function IndexedTables._merge!(dst::IndexedTable, src::IndexedTable, f) 
    if length(dst.index)==0 || isless(dst.index[end], src.index[1]) 
     append!(dst.index, src.index) 
     append!(dst.data, src.data) 
    else 
     # merge to a new copy 
     new = _merge(dst, src, f) 
     ln = length(new) 
     # resize and copy data into dst 
     resize!(dst.index, ln) 
     copy!(dst.index, new.index) 
     resize!(dst.data, ln) 
     copy!(dst.data, new.data) 
    end 
    return dst 
end 

julia> t[1,"c"] = t[1,"a"] + t[1,"b"] 
3 

_merge!を呼び出しflush!定着

をすることによって行うことができます。

もちろん、プルリクエスト/発行はIndexedTables.jlで開く必要があります。アントネッロ、あなたはこれをしますか?

+1

Dan Getzありがとう、私は問題の根を見つけたものとしてプルリクエストを発行させました:-) – Antonello

+1

OK。 PRを開きました –

+0

[the pr](https://github.com/JuliaComputing/IndexedTables.jl/pull/88)に注意してください。 – Antonello

関連する問題