Skip to content
This repository was archived by the owner on May 5, 2019. It is now read-only.

Commit 9b65533

Browse files
committed
lots of edits
clarify error messages, fix spacing, address case of length(::Symbol) and length(::String) not giving the desired output (Vector length), and unify constructors in accepting AbstractVector{Symbol} for colnames
1 parent 7462612 commit 9b65533

File tree

1 file changed

+30
-40
lines changed

1 file changed

+30
-40
lines changed

src/datatable/datatable.jl

Lines changed: 30 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -77,39 +77,33 @@ type DataTable <: AbstractDataTable
7777
if length(columns) == length(colindex) == 0
7878
return new(Vector{Any}(0), Index())
7979
elseif length(columns) != length(colindex)
80-
throw(DimensionMismatch("Number of columns ($(length(columns))) and column names ($(length(colindex))) are not equal"))
80+
throw(DimensionMismatch("Number of columns ($(length(columns))) and number of column names ($(length(colindex))) are not equal"))
8181
end
82-
lengths = length.(columns)
82+
lengths = [isa(col, AbstractArray) ? length(col) : 1 for col in columns]
8383
minlen, maxlen = extrema(lengths)
8484
if minlen == 0 && maxlen == 0
8585
return new(columns, colindex)
8686
elseif minlen != maxlen
8787
# recycle scalars
88-
if minlen == 1 && maxlen > 1
89-
indices = find(lengths .== minlen)
90-
for i in indices
91-
if !(typeof(columns[i]) <: AbstractVector)
92-
columns[i] = fill(columns[i], maxlen)
93-
lengths[i] = maxlen
94-
end
95-
end
88+
for i in 1:length(columns)
89+
typeof(columns[i]) <: AbstractArray && continue
90+
columns[i] = fill(columns[i], maxlen)
91+
lengths[i] = maxlen
9692
end
97-
uniques = unique(lengths)
98-
if length(uniques) != 1
99-
estring = Vector{String}(length(uniques))
93+
uls = unique(lengths)
94+
if length(uls) != 1
95+
# estring = Vector{String}(length(uniques))
10096
strnames = string.(names(colindex))
101-
for (i,u) in enumerate(uniques)
102-
indices = find(lengths .== u)
103-
estring[i] = "column length ($(uniques[i])) for column(s) ($(join(strnames[indices], ", ")))"
104-
end
97+
estring = ["column length ($(uls[i])) for column(s) ($(join(strnames[find(uls .== u)], ", ")))"
98+
for (i,u) in enumerate(uls)]
10599
throw(DimensionMismatch(join(estring, " is incompatible with ")))
106100
end
107101
end
108102
for (i,c) in enumerate(columns)
109103
if isa(c, Range)
110104
columns[i] = collect(c)
111105
elseif !isa(c, AbstractVector)
112-
columns[i] = size(c, 2) > 1 ? throw(DimensionMismatch("columns must be 1-dimensional")) : [c]
106+
columns[i] = size(c, 2) > 1 ? throw(DimensionMismatch("columns must be 1-dimensional")) : [c]
113107
end
114108
end
115109
return new(columns, colindex)
@@ -120,21 +114,16 @@ function DataTable(; kwargs...)
120114
if length(kwargs) == 0
121115
return DataTable(Any[], Index())
122116
end
123-
colnames = Vector{Symbol}(length(kwargs))
124-
columns = Vector{Any}(length(kwargs))
125-
for (i,(k,v)) in enumerate(kwargs)
126-
colnames[i] = Symbol(k)
127-
columns[i] = v
128-
end
117+
colnames = [Symbol(k) for (k,v) in kwargs]
118+
columns = Any[v for (k,v) in kwargs]
129119
DataTable(columns, Index(colnames))
130120
end
131121

132122
function DataTable(columns::AbstractVector,
133-
cnames::Vector{Symbol} = gennames(length(columns)))
134-
return DataTable(convert(Vector{Any}, columns), Index(cnames))
123+
cnames::AbstractVector{Symbol} = gennames(length(columns)))
124+
return DataTable(convert(Vector{Any}, columns), Index(convert(Vector{Symbol}, cnames)))
135125
end
136126

137-
138127
# Initialize empty DataTable objects of arbitrary size
139128
function DataTable(t::Type, nrows::Integer, ncols::Integer)
140129
columns = Vector{Any}(ncols)
@@ -146,40 +135,41 @@ function DataTable(t::Type, nrows::Integer, ncols::Integer)
146135
end
147136

148137
# Initialize an empty DataTable with specific eltypes and names
149-
function DataTable(column_eltypes::Vector{DataType}, cnames::Vector{Symbol}, nrows::Integer)
138+
function DataTable{T<:Type}(column_eltypes::AbstractVector{T}, cnames::AbstractVector{Symbol}, nrows::Integer)
150139
p = length(column_eltypes)
151140
columns = Vector{Any}(p)
152141
for j in 1:p
153-
T = column_eltypes[j]
154-
columns[j] = T <: Nullable ? NullableArray{eltype(T)}(nrows) : Vector{T}(nrows)
142+
colT = column_eltypes[j]
143+
columns[j] = colT <: Nullable ? NullableArray{eltype(colT)}(nrows) : Vector{colT}(nrows)
155144
end
156-
return DataTable(columns, Index(cnames))
145+
return DataTable(columns, Index(convert(Vector{Symbol}, cnames)))
157146
end
147+
158148
# Initialize an empty DataTable with specific eltypes and names
159149
# and whether a nominal array should be created
160-
function DataTable(column_eltypes::Vector{DataType}, cnames::Vector{Symbol},
161-
nominal::Vector{Bool}, nrows::Integer)
150+
function DataTable{T<:Type}(column_eltypes::AbstractVector{T}, cnames::AbstractVector{Symbol},
151+
nominal::Vector{Bool}, nrows::Integer)
162152
p = length(column_eltypes)
163153
columns = Vector{Any}(p)
164154
for j in 1:p
165-
T = column_eltypes[j]
155+
colT = column_eltypes[j]
166156
if nominal[j]
167-
columns[j] = T <: Nullable ? NullableCategoricalArray{T}(nrows) : CategoricalVector{T}(nrows)
157+
columns[j] = colT <: Nullable ? NullableCategoricalArray{colT}(nrows) : CategoricalVector{colT}(nrows)
168158
else
169-
columns[j] = T <: Nullable ? NullableArray{T}(nrows) : Vector{T}(nrows)
159+
columns[j] = colT <: Nullable ? NullableArray{colT}(nrows) : Vector{colT}(nrows)
170160
end
171161
end
172-
return DataTable(columns, Index(cnames))
162+
return DataTable(columns, Index(convert(Vector{Symbol}, cnames)))
173163
end
174164

175165
# Initialize an empty DataTable with specific eltypes
176-
function DataTable(column_eltypes::Vector{DataType}, nrows::Integer)
166+
function DataTable{T<:Type}(column_eltypes::AbstractVector{T}, nrows::Integer)
177167
p = length(column_eltypes)
178168
columns = Vector{Any}(p)
179169
cnames = gennames(p)
180170
for j in 1:p
181-
T = column_eltypes[j]
182-
columns[j] = T <: Nullable ? NullableArray{T}(nrows) : Vector{T}(nrows)
171+
colT = column_eltypes[j]
172+
columns[j] = colT <: Nullable ? NullableArray{colT}(nrows) : Vector{colT}(nrows)
183173
end
184174
return DataTable(columns, Index(cnames))
185175
end

0 commit comments

Comments
 (0)