@@ -2297,339 +2297,3 @@ test(6015.907, frolladapt(c(1L,3L,2L), 2L), error="be sorted, have no duplicates
22972297test(6015.908, frolladapt(c(1L,2L,2L), 2L), error="be sorted, have no duplicates, have no NAs")
22982298test(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
22992299test(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