Skip to content

Commit 00bc3b9

Browse files
committed
add optional parameter and move batch tests
1 parent 4ea3eb0 commit 00bc3b9

File tree

8 files changed

+368
-341
lines changed

8 files changed

+368
-341
lines changed

.github/workflows/R-CMD-check-occasional.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ jobs:
4242

4343
env:
4444
GITHUB_PAT: ${{ secrets.GITHUB_TOKEN }}
45+
RunAllDataTableTests: yes
4546

4647
steps:
4748
- name: Set locale

.github/workflows/R-CMD-check.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ jobs:
3838
RSPM: ${{ matrix.config.rspm }}
3939
GITHUB_PAT: ${{ secrets.GITHUB_TOKEN }}
4040
_R_CHECK_RD_CHECKRD_MINLEVEL_: -Inf
41+
RunAllDataTableTests: yes
4142

4243
steps:
4344
- uses: actions/checkout@v4

.gitlab-ci.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ variables:
1313
TZ: "UTC" ## to avoid 'Failed to create bus connection' from timedatectl via Sys.timezone() on Docker with R 3.4.
1414
## Setting TZ for all GLCI jobs to isolate them from timezone. We could have a new GLCI job to test under
1515
## a non-UTC timezone, although, that's what we do routinely in dev.
16+
RunAllDataTableTests: "yes" ## run optional tests in CI
1617
R_REL_VERSION: "4.5" # only raise when RTOOLS for REL is available
1718
R_REL_WIN_BIN: "https://cloud.r-project.org/bin/windows/base/old/4.5.0/R-4.5.0-win.exe"
1819
R_DEV_VERSION: "4.6"

R/test.data.table.R

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,12 @@
11
test.data.table = function(script="tests.Rraw", verbose=FALSE, pkg=".", silent=FALSE, showProgress=interactive()&&!silent, testPattern=NULL,
2-
memtest=Sys.getenv("TEST_DATA_TABLE_MEMTEST", 0L), memtest.id=NULL) {
3-
stopifnot(isTRUEorFALSE(verbose), isTRUEorFALSE(silent), isTRUEorFALSE(showProgress))
2+
memtest=Sys.getenv("TEST_DATA_TABLE_MEMTEST", 0L), memtest.id=NULL, optional=FALSE) {
3+
stopifnot(isTRUEorFALSE(verbose), isTRUEorFALSE(silent), isTRUEorFALSE(showProgress), isTRUEorFALSE(optional))
4+
5+
# Skip optional tests unless RunAllDataTableTests is set
6+
if (optional && Sys.getenv("RunAllDataTableTests") != "yes") {
7+
return(invisible(TRUE))
8+
}
9+
410
memtest = as.integer(memtest)
511
stopifnot(length(memtest)==1L, memtest %in% 0:2)
612
memtest.id = as.integer(memtest.id)

inst/tests/froll.Rraw

Lines changed: 0 additions & 336 deletions
Original file line numberDiff line numberDiff line change
@@ -2297,339 +2297,3 @@ test(6015.907, frolladapt(c(1L,3L,2L), 2L), error="be sorted, have no duplicates
22972297
test(6015.908, frolladapt(c(1L,2L,2L), 2L), error="be sorted, have no duplicates, have no NAs")
22982298
test(6015.909, frolladapt(c(1L,2L,NA_integer_), 2L), error="be sorted, have no duplicates, have no NAs") ## loop that checks for sorted will detect NAs as well, except for first element
22992299
test(6015.910, frolladapt(c(NA_integer_,1L,2L), 2L), error="be sorted, have no duplicates, have no NAs") ## first NA is detected by extra check
2300-
2301-
## batch validation
2302-
set.seed(108)
2303-
makeNA = function(x, ratio=0.1, nf=FALSE) {
2304-
n = as.integer(length(x) * ratio)
2305-
id = sample(length(x), n)
2306-
if (!nf) {
2307-
x[id] = NA
2308-
} else {
2309-
x[id[1:(n/4)]] = NA
2310-
x[id[(n/4+1):(n/2)]] = NaN
2311-
x[id[(n/2+1):(3*n/4)]] = -Inf
2312-
x[id[(3*n/4+1):n]] = +Inf
2313-
}
2314-
x
2315-
}
2316-
## against base to verify exactness of non-finite values, not handled in zoo
2317-
rollfun = function(x, n, FUN, fill=NA_real_, na.rm=FALSE, nf.rm=FALSE, partial=FALSE) {
2318-
ans = rep(fill, nx<-length(x))
2319-
f = match.fun(FUN)
2320-
if (nf.rm) x[is.infinite(x)] = NA_real_
2321-
for (i in seq_along(x)) {
2322-
ans[i] = if (n==0)
2323-
f(x[integer()], na.rm=na.rm)
2324-
else if (i >= n)
2325-
f(x[(i-n+1L):i], na.rm=na.rm)
2326-
else if (partial)
2327-
f(x[max((i-n+1), 1L):i], na.rm=na.rm)
2328-
else
2329-
as.double(fill)
2330-
}
2331-
ans
2332-
}
2333-
base_compare = function(x, n, funs=c("mean","sum","max","min","prod","median","var","sd"), algos=c("fast","exact")) {
2334-
num.step = 0.0001
2335-
for (fun in funs) {
2336-
for (na.rm in c(FALSE, TRUE)) {
2337-
for (fill in c(NA_real_, 0)) {
2338-
for (partial in c(FALSE,TRUE)) {
2339-
for (has.nf in c(NA,TRUE,FALSE)) {
2340-
if (identical(has.nf, FALSE)) {
2341-
if (na.rm)
2342-
next ## errors "not make sense"
2343-
if (any(!is.finite(x)))
2344-
next ## do not test warnings (mean, sum) or incorrect expect results (max)
2345-
}
2346-
for (algo in algos) {
2347-
num <<- num + num.step
2348-
eval(substitute( # so we can have values displayed in output/log rather than variables
2349-
test(.num, ignore.warning="no non-missing arguments",
2350-
rollfun(x, n, FUN=.fun, fill=.fill, na.rm=.na.rm, partial=.partial),
2351-
froll(.fun, x, n, fill=.fill, na.rm=.na.rm, algo=.algo, partial=.partial, has.nf=.has.nf)),
2352-
list(.num=num, .fun=fun, .fill=fill, .na.rm=na.rm, .algo=algo, .partial=partial, .has.nf=has.nf)
2353-
))
2354-
}
2355-
}
2356-
num <<- num + num.step
2357-
eval(substitute( # so we can have values displayed in output/log rather than variables
2358-
test(.num, ignore.warning="no non-missing arguments",
2359-
frollapply(x, n, FUN=match.fun(.fun), fill=.fill, na.rm=.na.rm, partial=.partial),
2360-
froll(.fun, x, n, fill=.fill, na.rm=.na.rm, partial=.partial)),
2361-
list(.num=num, .fun=fun, .fill=fill, .na.rm=na.rm, .partial=partial)
2362-
))
2363-
}
2364-
}
2365-
}
2366-
}
2367-
}
2368-
num = 7000.0
2369-
x = rnorm(1e3); n = 50
2370-
base_compare(x, n)
2371-
x = rnorm(1e3+1); n = 50 ## uneven len
2372-
base_compare(x, n)
2373-
x = rnorm(1e3); n = 51 ## uneven window
2374-
base_compare(x, n)
2375-
x = rnorm(1e3+1); n = 51
2376-
base_compare(x, n)
2377-
x = sort(rnorm(1e3)); n = 50 ## inc
2378-
base_compare(x, n)
2379-
x = sort(rnorm(1e3+1)); n = 50
2380-
base_compare(x, n)
2381-
x = sort(rnorm(1e3)); n = 51
2382-
base_compare(x, n)
2383-
x = sort(rnorm(1e3+1)); n = 51
2384-
base_compare(x, n)
2385-
x = rev(sort(rnorm(1e3))); n = 50 ## desc
2386-
base_compare(x, n)
2387-
x = rev(sort(rnorm(1e3+1))); n = 50
2388-
base_compare(x, n)
2389-
x = rev(sort(rnorm(1e3))); n = 51
2390-
base_compare(x, n)
2391-
x = rev(sort(rnorm(1e3+1))); n = 51
2392-
base_compare(x, n)
2393-
x = rep(rnorm(1), 1e3); n = 50 ## const
2394-
base_compare(x, n)
2395-
x = rep(rnorm(1), 1e3+1); n = 50
2396-
base_compare(x, n)
2397-
x = rep(rnorm(1), 1e3); n = 51
2398-
base_compare(x, n)
2399-
x = rep(rnorm(1), 1e3+1); n = 51
2400-
base_compare(x, n)
2401-
num = 7100.0
2402-
## random NA non-finite
2403-
x = makeNA(rnorm(1e3), nf=TRUE); n = 50
2404-
base_compare(x, n)
2405-
x = makeNA(rnorm(1e3+1), nf=TRUE); n = 50
2406-
base_compare(x, n)
2407-
x = makeNA(rnorm(1e3), nf=TRUE); n = 51
2408-
base_compare(x, n)
2409-
x = makeNA(rnorm(1e3+1), nf=TRUE); n = 51
2410-
base_compare(x, n)
2411-
x = makeNA(rnorm(1e3), nf=TRUE); n = 0
2412-
base_compare(x, n)
2413-
2414-
#### against zoo
2415-
if (requireNamespace("zoo", quietly=TRUE)) {
2416-
drollapply = function(...) as.double(zoo::rollapply(...)) # rollapply is not consistent in data type of answer, force to double
2417-
zoo_compare = function(x, n, funs=c("mean","sum","max","min","prod","median","var","sd"), algos=c("fast","exact")) {
2418-
num.step = 0.0001
2419-
#### fun, align, na.rm, fill, algo, partial
2420-
for (fun in funs) {
2421-
for (align in c("right","center","left")) {
2422-
for (na.rm in c(FALSE, TRUE)) {
2423-
for (fill in c(NA_real_, 0)) {
2424-
for (partial in c(FALSE,TRUE)) {
2425-
if (partial && align=="center")
2426-
next ## not implemented
2427-
for (has.nf in c(NA,TRUE,FALSE)) {
2428-
if (identical(has.nf, FALSE)) {
2429-
if (na.rm)
2430-
next ## errors "not make sense"
2431-
if (any(!is.finite(x)))
2432-
next ## do not test warnings (mean, sum, prod) or incorrect expect results (max, min, median)
2433-
}
2434-
for (algo in algos) {
2435-
num <<- num + num.step
2436-
eval(substitute( # so we can have values displayed in output/log rather than variables
2437-
test(.num, ignore.warning="no non-missing arguments",
2438-
drollapply(x, n, FUN=.fun, fill=.fill, align=.align, na.rm=.na.rm, partial=.partial),
2439-
froll(.fun, x, n, align=.align, fill=.fill, na.rm=.na.rm, algo=.algo, partial=.partial, has.nf=.has.nf)),
2440-
list(.num=num, .fun=fun, .align=align, .fill=fill, .na.rm=na.rm, .algo=algo, .partial=partial, .has.nf=has.nf)
2441-
))
2442-
}
2443-
}
2444-
num <<- num + num.step
2445-
eval(substitute( # so we can have values displayed in output/log rather than variables
2446-
test(.num, ignore.warning="no non-missing arguments",
2447-
frollapply(x, n, FUN=.fun, fill=.fill, align=.align, na.rm=.na.rm, partial=.partial),
2448-
froll(.fun, x, n, align=.align, fill=.fill, na.rm=.na.rm, partial=.partial)),
2449-
list(.num=num, .fun=fun, .align=align, .fill=fill, .na.rm=na.rm, .partial=partial)
2450-
))
2451-
}
2452-
}
2453-
}
2454-
}
2455-
}
2456-
}
2457-
num = 7200.0
2458-
## no NA
2459-
x = rnorm(1e3); n = 50 # x even, n even
2460-
zoo_compare(x, n)
2461-
x = rnorm(1e3+1); n = 50 # x odd, n even
2462-
zoo_compare(x, n)
2463-
x = rnorm(1e3); n = 51 # x even, n odd
2464-
zoo_compare(x, n)
2465-
x = rnorm(1e3+1); n = 51 # x odd, n odd
2466-
zoo_compare(x, n)
2467-
## leading and trailing NAs
2468-
x = c(rep(NA, 60), rnorm(1e3), rep(NA, 60)); n = 50
2469-
zoo_compare(x, n)
2470-
x = c(rep(NA, 60), rnorm(1e3+1), rep(NA, 60)); n = 50
2471-
zoo_compare(x, n)
2472-
x = c(rep(NA, 60), rnorm(1e3), rep(NA, 60)); n = 51
2473-
zoo_compare(x, n)
2474-
x = c(rep(NA, 60), rnorm(1e3+1), rep(NA, 60)); n = 51
2475-
zoo_compare(x, n)
2476-
## random NA
2477-
x = makeNA(rnorm(1e3)); n = 50
2478-
zoo_compare(x, n)
2479-
x = makeNA(rnorm(1e3+1)); n = 50
2480-
zoo_compare(x, n)
2481-
x = makeNA(rnorm(1e3)); n = 51
2482-
zoo_compare(x, n)
2483-
x = makeNA(rnorm(1e3+1)); n = 51
2484-
zoo_compare(x, n)
2485-
}
2486-
#### adaptive moving average compare
2487-
arollfun = function(FUN, x, n, na.rm=FALSE, align=c("right","left"), fill=NA, nf.rm=FALSE, partial=FALSE) {
2488-
# adaptive moving average in R
2489-
stopifnot((nx<-length(x))==length(n))
2490-
align = match.arg(align)
2491-
ans = rep(fill, nx)
2492-
if (nf.rm) x[is.infinite(x)] = NA_real_
2493-
f = match.fun(FUN)
2494-
if (align=="right") {
2495-
for (i in seq_along(x)) {
2496-
if (n[i] == 0)
2497-
ans[i] = f(x[integer()], na.rm=na.rm)
2498-
else if (i >= n[i])
2499-
ans[i] = f(x[(i-n[i]+1L):i], na.rm=na.rm)
2500-
else if (partial)
2501-
ans[i] = f(x[1L:i], na.rm=na.rm)
2502-
}
2503-
} else {
2504-
for (i in seq_along(x)) {
2505-
if (n[i] == 0)
2506-
ans[i] = f(x[integer()], na.rm=na.rm)
2507-
else if (i <= nx-n[i]+1)
2508-
ans[i] = f(x[i:(i+n[i]-1L)], na.rm=na.rm)
2509-
else if (partial)
2510-
ans[i] = f(x[i:length(x)], na.rm=na.rm)
2511-
}
2512-
}
2513-
ans
2514-
}
2515-
afun_compare = function(x, n, funs=c("mean","sum","max","min","prod","median","var","sd"), algos=c("fast","exact")) {
2516-
num.step = 0.0001
2517-
#### fun, align, na.rm, fill, algo
2518-
for (fun in funs) {
2519-
for (align in c("right","left")) {
2520-
for (na.rm in c(FALSE, TRUE)) {
2521-
for (fill in c(NA_real_, 0)) {
2522-
for (partial in c(FALSE, TRUE)) {
2523-
for (has.nf in c(NA, TRUE, FALSE)) {
2524-
if (identical(has.nf, FALSE)) {
2525-
if (na.rm) {
2526-
next
2527-
} ## errors "not make sense"
2528-
if (any(!is.finite(x))) {
2529-
next
2530-
} ## do not test warnings (mean, sum, prod) or incorrect expect results (max, min, median)
2531-
}
2532-
for (algo in algos) {
2533-
num <<- num + num.step
2534-
eval(substitute(
2535-
test(.num,
2536-
ignore.warning = "no non-missing arguments",
2537-
arollfun(.fun, x, n, fill = .fill, na.rm = .na.rm, align = .align, partial=.partial),
2538-
froll(.fun, x, n, fill=.fill, na.rm=.na.rm, algo=.algo, adaptive=TRUE, align=.align, has.nf=.has.nf, partial=.partial)
2539-
),
2540-
list(.num = num, .fun = fun, .fill = fill, .na.rm = na.rm, .algo = algo, .align = align, .partial=partial, .has.nf = has.nf)
2541-
))
2542-
}
2543-
}
2544-
}
2545-
num <<- num + num.step
2546-
eval(substitute(
2547-
test(.num, ignore.warning="no non-missing arguments",
2548-
frollapply(x, n, FUN=match.fun(.fun), fill=.fill, na.rm=.na.rm, adaptive=TRUE, align=.align),
2549-
froll(.fun, x, n, fill=.fill, na.rm=.na.rm, adaptive=TRUE, align=.align)),
2550-
list(.num=num, .fun=fun, .fill=fill, .na.rm=na.rm, .align=align)
2551-
))
2552-
}
2553-
}
2554-
}
2555-
}
2556-
}
2557-
num = 7300.0
2558-
x = rnorm(1e3); n = sample(50, length(x), TRUE)
2559-
afun_compare(x, n)
2560-
x = rnorm(1e3+1); n = sample(50, length(x), TRUE) ## uneven len
2561-
afun_compare(x, n)
2562-
x = rnorm(1e3); n = sample(51, length(x), TRUE) ## uneven window
2563-
afun_compare(x, n)
2564-
x = rnorm(1e3+1); n = sample(51, length(x), TRUE)
2565-
afun_compare(x, n)
2566-
x = sort(rnorm(1e3)); n = sample(50, length(x), TRUE) ## inc
2567-
afun_compare(x, n)
2568-
x = sort(rnorm(1e3+1)); n = sample(50, length(x), TRUE)
2569-
afun_compare(x, n)
2570-
x = sort(rnorm(1e3)); n = sample(51, length(x), TRUE)
2571-
afun_compare(x, n)
2572-
x = sort(rnorm(1e3+1)); n = sample(51, length(x), TRUE)
2573-
afun_compare(x, n)
2574-
x = rev(sort(rnorm(1e3))); n = sample(50, length(x), TRUE) ## desc
2575-
afun_compare(x, n)
2576-
x = rev(sort(rnorm(1e3+1))); n = sample(50, length(x), TRUE)
2577-
afun_compare(x, n)
2578-
x = rev(sort(rnorm(1e3))); n = sample(51, length(x), TRUE)
2579-
afun_compare(x, n)
2580-
x = rev(sort(rnorm(1e3+1))); n = sample(51, length(x), TRUE)
2581-
afun_compare(x, n)
2582-
x = rep(rnorm(1), 1e3); n = sample(50, length(x), TRUE) ## const
2583-
afun_compare(x, n)
2584-
x = rep(rnorm(1), 1e3+1); n = sample(50, length(x), TRUE)
2585-
afun_compare(x, n)
2586-
x = rep(rnorm(1), 1e3); n = sample(51, length(x), TRUE)
2587-
afun_compare(x, n)
2588-
x = rep(rnorm(1), 1e3+1); n = sample(51, length(x), TRUE)
2589-
afun_compare(x, n)
2590-
num = 7400.0
2591-
#### no NA
2592-
x = rnorm(1e3); n = sample(50, length(x), TRUE) # x even, n even
2593-
afun_compare(x, n)
2594-
x = rnorm(1e3+1); n = sample(50, length(x), TRUE) # x odd, n even
2595-
afun_compare(x, n)
2596-
x = rnorm(1e3); n = sample(51, length(x), TRUE) # x even, n odd
2597-
afun_compare(x, n)
2598-
x = rnorm(1e3+1); n = sample(51, length(x), TRUE) # x odd, n odd
2599-
afun_compare(x, n)
2600-
x = rnorm(1e3); n = sample(0:49, length(x), TRUE) # x even, n even
2601-
afun_compare(x, n)
2602-
#### leading and trailing NAs
2603-
x = c(rep(NA, 60), rnorm(1e3), rep(NA, 60)); n = sample(50, length(x), TRUE)
2604-
afun_compare(x, n)
2605-
x = c(rep(NA, 60), rnorm(1e3+1), rep(NA, 60)); n = sample(50, length(x), TRUE)
2606-
afun_compare(x, n)
2607-
x = c(rep(NA, 60), rnorm(1e3), rep(NA, 60)); n = sample(51, length(x), TRUE)
2608-
afun_compare(x, n)
2609-
x = c(rep(NA, 60), rnorm(1e3+1), rep(NA, 60)); n = sample(51, length(x), TRUE)
2610-
afun_compare(x, n)
2611-
x = c(rep(NA, 60), rnorm(1e3), rep(NA, 60)); n = sample(0:49, length(x), TRUE)
2612-
afun_compare(x, n)
2613-
#### random NA
2614-
x = makeNA(rnorm(1e3)); n = sample(50, length(x), TRUE)
2615-
afun_compare(x, n)
2616-
x = makeNA(rnorm(1e3+1)); n = sample(50, length(x), TRUE)
2617-
afun_compare(x, n)
2618-
x = makeNA(rnorm(1e3)); n = sample(51, length(x), TRUE)
2619-
afun_compare(x, n)
2620-
x = makeNA(rnorm(1e3+1)); n = sample(51, length(x), TRUE)
2621-
afun_compare(x, n)
2622-
x = makeNA(rnorm(1e3)); n = sample(0:49, length(x), TRUE)
2623-
afun_compare(x, n)
2624-
#### random NA non-finites
2625-
x = makeNA(rnorm(1e3), nf=TRUE); n = sample(50, length(x), TRUE)
2626-
afun_compare(x, n)
2627-
x = makeNA(rnorm(1e3+1), nf=TRUE); n = sample(50, length(x), TRUE)
2628-
afun_compare(x, n)
2629-
x = makeNA(rnorm(1e3), nf=TRUE); n = sample(51, length(x), TRUE)
2630-
afun_compare(x, n)
2631-
x = makeNA(rnorm(1e3+1), nf=TRUE); n = sample(51, length(x), TRUE)
2632-
afun_compare(x, n)
2633-
x = makeNA(rnorm(1e3), nf=TRUE); n = sample(0:49, length(x), TRUE)
2634-
afun_compare(x, n)
2635-
rm(num)

0 commit comments

Comments
 (0)