@@ -13,6 +13,7 @@ if (exists("test.data.table", .GlobalEnv, inherits=FALSE)) {
1313 forderv = data.table:::forderv
1414}
1515
16+ addresses = function(x) vapply(x, address, "")
1617copied = function(ans, l) {
1718 all(!addresses(ans) %chin% unlist(recursive=FALSE, lapply(l, addresses)))
1819}
@@ -36,8 +37,6 @@ test(2.02, fdistinct(data.table(x=c(1L, 1:2)), on="z", mult="last"), error="must
3637test(2.03, fdistinct(data.table(x=c(1L, 1:2)), on="x", mult="last", cols=character()), error="must be non-zero length, non-NA, integer or character columns of")
3738test(2.04, fdistinct(data.table(x=c(1L, 1:2, y=1:3)), on="x", mult="last", copy=NA), error="must be TRUE or FALSE")
3839local({
39- addresses = function(x) vapply(x, address, "")
40-
4140 d = data.table(x=1:2, y=1:2)
4241 test(2.05, ans <- fdistinct(d, on="x", mult="last"), d)
4342 test(2.06, intersect(addresses(ans), addresses(d)), character())
@@ -131,183 +130,195 @@ test(13.4, cbindlist(list(data.table(a=1:2), data.table(b=3:4, key="b"))), data.
131130## test copy-ness argument in mergepair
132131
133132### LHS equal to RHS: no copy in all cases
134- num = 21.000
135- l = list(
136- lhs = data.table(id1=1:2, v1=1:2),
137- rhs = data.table(id1=1:2, v2=1:2)
138- )
139- expected = data.table(id1=1:2, v1=1:2, v2=1:2)
140- for (how in c("inner","left","right","full")) {
141- num = trunc(num*10)/10 + 0.1
142- for (mult in c("all","first","last","error")) {
143- num = trunc(num*100)/100 + 0.01
144- test(num<-num+0.001, ans <- mergepair(l$lhs, l$rhs, on="id1", how=how, mult=mult, copy=TRUE), expected) ## copy=TRUE: no shared columns
145- test(num<-num+0.001, copied(ans, l))
146- test(num<-num+0.001, ans <- mergepair(l$lhs, l$rhs, on="id1", how=how, mult=mult, copy=FALSE), expected) ## copy=FALSE: LHS shared but no RHS
147- test(num<-num+0.001, notcopied(ans, l, how=how))
133+ local({
134+ l = list(
135+ lhs = data.table(id1=1:2, v1=1:2),
136+ rhs = data.table(id1=1:2, v2=1:2)
137+ )
138+ expected = data.table(id1=1:2, v1=1:2, v2=1:2)
139+ frac = 0.0
140+ for (how in c("inner", "left", "right", "full")) {
141+ frac = frac + 0.1
142+ for (mult in c("all", "first", "last", "error")) {
143+ frac = frac + 0.01
144+ test(21 + (frac <- frac + 0.001), ans <- mergepair(l$lhs, l$rhs, on="id1", how=how, mult=mult, copy=TRUE), expected) ## copy=TRUE: no shared columns
145+ test(21 + (frac <- frac + 0.001), copied(ans, l))
146+ test(21 + (frac <- frac + 0.001), ans <- mergepair(l$lhs, l$rhs, on="id1", how=how, mult=mult, copy=FALSE), expected) ## copy=FALSE: LHS shared but no RHS
147+ test(21 + (frac <- frac + 0.001), notcopied(ans, l, how=how))
148+ }
148149 }
149- }
150+ })
151+
150152### RHS includes LHS: no copy in inner, left, right
151- num = 22.000
152- unless = "full"
153- l = list(
154- lhs = data.table(id1=1:2, v1=1:2),
155- rhs = data.table(id1=1:3, v2=1:3)
156- )
157- expected = list(
158- inner = data.table(id1=1:2, v1=1:2, v2=1:2),
159- left = data.table(id1=1:2, v1=1:2, v2=1:2),
160- right = data.table(id1=1:3, v1=c(1:2,NA), v2=1:3),
161- full = data.table(id1=1:3, v1=c(1:2,NA), v2=1:3)
162- )
163- for (how in c("inner","left","right","full")) {
164- num = trunc(num*10)/10 + 0.1
165- for (mult in c("all","first","last","error")) {
166- num = trunc(num*100)/100 + 0.01
167- test(num<-num+0.001, ans <- mergepair(l$lhs, l$rhs, on="id1", how=how, mult=mult, copy=TRUE), expected[[how]])
168- test(num<-num+0.001, copied(ans, l))
169- test(num<-num+0.001, ans <- mergepair(l$lhs, l$rhs, on="id1", how=how, mult=mult, copy=FALSE), expected[[how]])
170- test(num<-num+0.001, notcopied(ans, l, how=how, unless=unless))
153+ local({
154+ l = list(
155+ lhs = data.table(id1=1:2, v1=1:2),
156+ rhs = data.table(id1=1:3, v2=1:3)
157+ )
158+ expected = list(
159+ inner = data.table(id1=1:2, v1=1:2, v2=1:2),
160+ left = data.table(id1=1:2, v1=1:2, v2=1:2),
161+ right = data.table(id1=1:3, v1=c(1:2,NA), v2=1:3),
162+ full = data.table(id1=1:3, v1=c(1:2,NA), v2=1:3)
163+ )
164+ frac = 0.0
165+ for (how in c("inner", "left", "right", "full")) {
166+ frac = frac + 0.1
167+ for (mult in c("all", "first", "last", "error")) {
168+ frac = frac + 0.01
169+ test(22 + (frac <- frac + 0.001), ans <- mergepair(l$lhs, l$rhs, on="id1", how=how, mult=mult, copy=TRUE), expected[[how]])
170+ test(22 + (frac <- frac + 0.001), copied(ans, l))
171+ test(22 + (frac <- frac + 0.001), ans <- mergepair(l$lhs, l$rhs, on="id1", how=how, mult=mult, copy=FALSE), expected[[how]])
172+ test(22 + (frac <- frac + 0.001), notcopied(ans, l, how=how, unless="full"))
173+ }
171174 }
172- }
175+ })
176+
173177### LHS includes RHS: no copy in left, right, full
174- num = 23.000
175- unless = "inner"
176- l = list(
177- lhs = data.table(id1=1:3, v1=1:3),
178- rhs = data.table(id1=1:2, v2=1:2)
179- )
180- expected = list(
181- inner = data.table(id1=1:2, v1=1:2, v2=1:2),
182- left = data.table(id1=1:3, v1=1:3, v2=c(1:2,NA)),
183- right = data.table(id1=1:2, v1=1:2, v2=1:2),
184- full = data.table(id1=1:3, v1=1:3, v2=c(1:2,NA))
185- )
186- for (how in c("inner","left","right","full")) {
187- num = trunc(num*10)/10 + 0.1
188- for (mult in c("all","first","last","error")) {
189- num = trunc(num*100)/100 + 0.01
190- test(num<-num+0.001, ans <- mergepair(l$lhs, l$rhs, on="id1", how=how, mult=mult, copy=TRUE), expected[[how]])
191- test(num<-num+0.001, copied(ans, l))
192- test(num<-num+0.001, ans <- mergepair(l$lhs, l$rhs, on="id1", how=how, mult=mult, copy=FALSE), expected[[how]])
193- test(num<-num+0.001, notcopied(ans, l, how=how, unless=unless))
178+ local({
179+ l = list(
180+ lhs = data.table(id1=1:3, v1=1:3),
181+ rhs = data.table(id1=1:2, v2=1:2)
182+ )
183+ expected = list(
184+ inner = data.table(id1=1:2, v1=1:2, v2=1:2),
185+ left = data.table(id1=1:3, v1=1:3, v2=c(1:2,NA)),
186+ right = data.table(id1=1:2, v1=1:2, v2=1:2),
187+ full = data.table(id1=1:3, v1=1:3, v2=c(1:2,NA))
188+ )
189+ frac = 0.0
190+ for (how in c("inner", "left", "right", "full")) {
191+ frac = frac + 0.1
192+ for (mult in c("all", "first", "last", "error")) {
193+ frac = frac + 0.01
194+ test(23 + (frac <- frac + 0.001), ans <- mergepair(l$lhs, l$rhs, on="id1", how=how, mult=mult, copy=TRUE), expected[[how]])
195+ test(23 + (frac <- frac + 0.001), copied(ans, l))
196+ test(23 + (frac <- frac + 0.001), ans <- mergepair(l$lhs, l$rhs, on="id1", how=how, mult=mult, copy=FALSE), expected[[how]])
197+ test(23 + (frac <- frac + 0.001), notcopied(ans, l, how=how, unless="inner"))
198+ }
194199 }
195- }
200+ })
201+
196202### LHS single nonmatch RHS on both sides: no copy in left, right
197- num = 24.000
198- unless = c("inner","full")
199- l = list(
200- lhs = data.table(id1=3:1, v1=1:3),
201- rhs = data.table(id1=c(4L,2:1), v2=1:3)
202- )
203- expected = list(
204- inner = data.table(id1=2:1, v1=2:3, v2=2:3),
205- left = data.table(id1=3:1, v1=1:3, v2=c(NA,2:3)),
206- right = data.table(id1=c(4L,2:1), v1=c(NA,2:3), v2=1:3),
207- full = data.table(id1=c(3:1,4L), v1=c(1:3,NA), v2=c(NA,2:3,1L))
208- )
209- for (how in c("inner","left","right","full")) {
210- num = trunc(num*10)/10 + 0.1
211- for (mult in c("all","first","last","error")) {
212- num = trunc(num*100)/100 + 0.01
213- test(num<-num+0.001, ans <- mergepair(l$lhs, l$rhs, on="id1", how=how, mult=mult, copy=TRUE), expected[[how]])
214- test(num<-num+0.001, copied(ans, l))
215- test(num<-num+0.001, ans <- mergepair(l$lhs, l$rhs, on="id1", how=how, mult=mult, copy=FALSE), expected[[how]])
216- test(num<-num+0.001, notcopied(ans, l, how=how, unless=unless))
203+ local({
204+ l = list(
205+ lhs = data.table(id1=3:1, v1=1:3),
206+ rhs = data.table(id1=c(4L,2:1), v2=1:3)
207+ )
208+ expected = list(
209+ inner = data.table(id1=2:1, v1=2:3, v2=2:3),
210+ left = data.table(id1=3:1, v1=1:3, v2=c(NA,2:3)),
211+ right = data.table(id1=c(4L,2:1), v1=c(NA,2:3), v2=1:3),
212+ full = data.table(id1=c(3:1,4L), v1=c(1:3,NA), v2=c(NA,2:3,1L))
213+ )
214+ frac = 0.0
215+ for (how in c("inner", "left", "right", "full")) {
216+ frac = frac + 0.1
217+ for (mult in c("all", "first", "last", "error")) {
218+ frac = frac + 0.01
219+ test(24 + (frac <- frac + 0.001), ans <- mergepair(l$lhs, l$rhs, on="id1", how=how, mult=mult, copy=TRUE), expected[[how]])
220+ test(24 + (frac <- frac + 0.001), copied(ans, l))
221+ test(24 + (frac <- frac + 0.001), ans <- mergepair(l$lhs, l$rhs, on="id1", how=how, mult=mult, copy=FALSE), expected[[how]])
222+ test(24 + (frac <- frac + 0.001), notcopied(ans, l, how=how, unless=c("inner", "full")))
223+ }
217224 }
218- }
225+ })
226+
219227### LHS zero match RHS: no copy in left, right
220- num = 25.000
221- unless = c("inner","full")
222- l = list(
223- lhs = data.table(id1=2:1, v1 =1:2),
224- rhs = data.table(id1=3:4, v2=1:2 )
225- )
226- expected = list(
227- inner = data.table(id1=integer() , v1=integer() , v2=integer( )),
228- left = data.table(id1=2:1 , v1=1:2, v2= c(NA_integer_,NA)),
229- right = data.table(id1=3:4, v1=c(NA_integer_ ,NA), v2=1:2),
230- full = data.table(id1=c(2:1,3:4), v1=c(1:2,NA,NA), v2=c(NA,NA,1:2) )
231- )
232- for (how in c("inner","left","right","full")) {
233- num = trunc(num*10)/10 + 0.1
234- for (mult in c("all","first","last","error")) {
235- num = trunc(num*100)/100 + 0.01
236- test(num<-num+0.001, ans <- mergepair(l$lhs, l$rhs, on="id1", how=how, mult=mult, copy=TRUE), expected[[how]] )
237- test(num<-num+ 0.001, copied( ans, l) )
238- test(num<-num+ 0.001, ans <- mergepair(l$lhs , l$rhs, on="id1", how=how, mult=mult, copy=FALSE), expected[[how]] )
239- test(num<-num+0.001, notcopied(ans, l, how=how, unless=unless))
228+ local({
229+ l = list(
230+ lhs = data.table(id1=2:1, v1=1:2),
231+ rhs = data.table(id1=3:4, v2 =1:2)
232+ )
233+ expected = list(
234+ inner = data.table(id1=integer(), v1=integer(), v2=integer()),
235+ left = data.table(id1=2:1 , v1=1:2 , v2=c(NA_integer_,NA )),
236+ right = data.table(id1=3:4 , v1=c(NA_integer_,NA), v2=1:2 ),
237+ full = data.table(id1=c(2:1, 3:4) , v1=c(1:2 ,NA,NA ), v2=c(NA,NA, 1:2))
238+ )
239+ for (how in c("inner", "left", "right", "full")) {
240+ frac = frac + 0.1
241+ for (mult in c("all", "first", "last", "error")) {
242+ frac = frac + 0.01
243+ test(25 + (frac <- frac + 0.001), ans <- mergepair(l$lhs, l$rhs, on="id1", how=how, mult=mult, copy=TRUE), expected[[how]])
244+ test(25 + (frac <- frac + 0.001), copied(ans, l) )
245+ test(25 + (frac <- frac + 0.001), ans <- mergepair(l$lhs , l$rhs, on="id1", how=how, mult=mult, copy=FALSE), expected[[how]] )
246+ test(25 + (frac <- frac + 0.001), notcopied(ans , l, how=how, unless=c("inner", "full")) )
247+ }
240248 }
241- }
249+ })
250+
242251### LHS and RHS zero nrow: no copies
243- num = 26.000
244- unless = character()
245- l = list(
246- lhs = data.table(id1=integer(), v1 =integer()),
247- rhs = data.table(id1=integer(), v2=integer() )
248- )
249- expected = list(
250- inner = data.table(id1=integer(), v1=integer(), v2=integer()),
251- left = data.table(id1=integer(), v1=integer(), v2=integer()),
252- right = data.table(id1=integer(), v1=integer(), v2=integer()),
253- full = data.table(id1=integer(), v1=integer(), v2=integer() )
254- )
255- for (how in c("inner","left","right","full")) {
256- num = trunc(num*10)/10 + 0.1
257- for (mult in c("all","first","last","error")) {
258- num = trunc(num*100)/100 + 0.01
259- test(num<-num+0.001, ans <- mergepair(l$lhs, l$rhs, on="id1", how=how, mult=mult, copy=TRUE), expected[[how]] )
260- test(num<-num+ 0.001, copied( ans, l) )
261- test(num<-num+ 0.001, ans <- mergepair(l$lhs , l$rhs, on="id1", how=how, mult=mult, copy=FALSE), expected[[how]] )
262- test(num<-num+0.001, notcopied(ans, l, how=how, unless=unless))
252+ local({
253+ l = list(
254+ lhs = data.table(id1=integer(), v1=integer()),
255+ rhs = data.table(id1=integer(), v2 =integer())
256+ )
257+ expected = list(
258+ inner = data.table(id1=integer(), v1=integer(), v2=integer()),
259+ left = data.table(id1=integer(), v1=integer(), v2=integer()),
260+ right = data.table(id1=integer(), v1=integer(), v2=integer()),
261+ full = data.table(id1=integer(), v1=integer(), v2=integer())
262+ )
263+ for (how in c("inner", "left", "right", "full")) {
264+ frac = frac + 0.1
265+ for (mult in c("all", "first", "last", "error")) {
266+ frac = frac + 0.01
267+ test(26 + (frac <- frac + 0.001), ans <- mergepair(l$lhs, l$rhs, on="id1", how=how, mult=mult, copy=TRUE), expected[[how]])
268+ test(26 + (frac <- frac + 0.001), copied(ans, l) )
269+ test(26 + (frac <- frac + 0.001), ans <- mergepair(l$lhs , l$rhs, on="id1", how=how, mult=mult, copy=FALSE), expected[[how]] )
270+ test(26 + (frac <- frac + 0.001), notcopied(ans , l, how=how) )
271+ }
263272 }
264- }
273+ })
274+
265275### LHS has zero nrow: no copies
266- num = 27.000
267- unless = character()
268- l = list(
269- lhs = data.table(id1=integer(), v1=integer()),
270- rhs = data.table(id1=2:1, v2=1:2 )
271- )
272- expected = list(
273- inner = data.table(id1=integer(), v1=integer(), v2=integer()),
274- left = data.table(id1=integer() , v1=integer( ), v2=integer() ),
275- right = data.table(id1=2:1, v1=c(NA_integer_,NA), v2=1:2),
276- full = data.table(id1=2:1, v1=c(NA_integer_,NA), v2=1:2 )
277- )
278- for (how in c("inner","left","right","full")) {
279- num = trunc(num*10)/10 + 0.1
280- for (mult in c("all","first","last","error")) {
281- num = trunc(num*100)/100 + 0.01
282- test(num<-num+0.001, ans <- mergepair(l$lhs, l$rhs, on="id1", how=how, mult=mult, copy=TRUE), expected[[how]] )
283- test(num<-num+ 0.001, copied( ans, l) )
284- test(num<-num+ 0.001, ans <- mergepair(l$lhs , l$rhs, on="id1", how=how, mult=mult, copy=FALSE), expected[[how]] )
285- test(num<-num+0.001, notcopied(ans, l, how=how, unless=unless))
276+ local({
277+ l = list(
278+ lhs = data.table(id1=integer(), v1=integer()),
279+ rhs = data.table(id1=2:1, v2=1:2)
280+ )
281+ expected = list(
282+ inner = data.table(id1=integer(), v1=integer(), v2=integer()),
283+ left = data.table(id1=integer(), v1=integer(), v2=integer()),
284+ right = data.table(id1=2:1 , v1=c(NA_integer_,NA ), v2=1:2 ),
285+ full = data.table(id1=2:1, v1=c(NA_integer_,NA), v2=1:2)
286+ )
287+ for (how in c("inner", "left", "right", "full")) {
288+ frac = frac + 0.1
289+ for (mult in c("all", "first", "last" ,"error")) {
290+ frac = frac + 0.01
291+ test(27 + (frac <- frac + 0.001), ans <- mergepair(l$lhs, l$rhs, on="id1", how=how, mult=mult, copy=TRUE), expected[[how]])
292+ test(27 + (frac <- frac + 0.001), copied(ans, l) )
293+ test(27 + (frac <- frac + 0.001), ans <- mergepair(l$lhs , l$rhs, on="id1", how=how, mult=mult, copy=FALSE), expected[[how]] )
294+ test(27 + (frac <- frac + 0.001), notcopied(ans , l, how=how) )
295+ }
286296 }
287- }
297+ })
298+
288299### RHS has zero nrow
289- num = 28.000
290- unless = "inner"
291- l = list(
292- lhs = data.table(id1=2:1, v1=1:2),
293- rhs = data.table(id1=integer(), v2=integer() )
294- )
295- expected = list(
296- inner = data.table(id1=integer() , v1=integer() , v2=integer( )),
297- left = data.table(id1=2:1 , v1=1:2 , v2=c(NA_integer_,NA )),
298- right = data.table(id1=integer() , v1=integer() , v2=integer()),
299- full = data.table(id1=2:1, v1=1:2, v2=c(NA_integer_,NA) )
300- )
301- for (how in c("inner","left","right","full")) {
302- num = trunc(num*10)/10 + 0.1
303- for (mult in c("all","first","last","error")) {
304- num = trunc(num*100)/100 + 0.01
305- test(num<-num+0.001, ans <- mergepair(l$lhs, l$rhs, on="id1", how=how, mult=mult, copy=TRUE), expected[[how]] )
306- test(num<-num+ 0.001, copied( ans, l) )
307- test(num<-num+ 0.001, ans <- mergepair(l$lhs , l$rhs, on="id1", how=how, mult=mult, copy=FALSE), expected[[how]] )
308- test(num<-num+0.001, notcopied(ans, l, how=how, unless=unless))
300+ local({
301+ l = list(
302+ lhs = data.table(id1=2:1, v1=1:2),
303+ rhs = data.table(id1=integer(), v2=integer())
304+ )
305+ expected = list(
306+ inner = data.table(id1=integer(), v1=integer(), v2=integer()),
307+ left = data.table(id1=2:1 , v1=1:2 , v2=c(NA_integer_,NA )),
308+ right = data.table(id1=integer() , v1=integer() , v2=integer( )),
309+ full = data.table(id1=2:1 , v1=1:2 , v2=c(NA_integer_,NA))
310+ )
311+ for (how in c("inner", "left", "right", "full")) {
312+ frac = frac + 0.1
313+ for (mult in c("all", "first", "last", "error")) {
314+ frac = frac + 0.01
315+ test(28 + (frac <- frac + 0.001), ans <- mergepair(l$lhs, l$rhs, on="id1", how=how, mult=mult, copy=TRUE), expected[[how]])
316+ test(28 + (frac <- frac + 0.001), copied(ans, l) )
317+ test(28 + (frac <- frac + 0.001), ans <- mergepair(l$lhs , l$rhs, on="id1", how=how, mult=mult, copy=FALSE), expected[[how]] )
318+ test(28 + (frac <- frac + 0.001), notcopied(ans , l, how=how, unless="inner") )
319+ }
309320 }
310- }
321+ })
311322
312323## fdistinct, another round
313324
0 commit comments