Provides ability to control how many times in function calls conditions are thrown (shown to the user). Includes control of warnings and messages.
control how many times conditions are thrown
Package API:
handle_messageshandle_conditionsConditionKeeperhandle_warningscapture_messagecapture_warningUse cases for conditionz functions:
ConditionKeeper is what you want to use if you want to keep track of conditions inside a
function being applied many times, either in a for loop or lapply style fashion.handle_conditions/handle_messages/handle_warnings is what you want to use if the multiple
conditions are happening within a single function or code blockcapture_message/capture_warning are meant for capturing messages/warnings into a useable
listThe CRAN version:
install.packages("conditionz")
Or the development version:
install.packages("devtools")
devtools::install_github("ropenscilabs/conditionz")
library("conditionz")
ConditionKeeper is the internal R6 class that handles keeping track of
conditions and lets us determine if conditions have been encountered,
how many times, etc.
x <- ConditionKeeper$new(times = 4)
x
#> ConditionKeeper
#> id: 6824b49c-be8f-4ba1-9acc-47115b6bccbb
#> times: 4
#> messages: 0
x$get_id()
#> [1] "6824b49c-be8f-4ba1-9acc-47115b6bccbb"
x$add("one")
x$add("two")
x
#> ConditionKeeper
#> id: 6824b49c-be8f-4ba1-9acc-47115b6bccbb
#> times: 4
#> messages: 2
#> one two
x$thrown_already("one")
#> [1] TRUE
x$thrown_already("bears")
#> [1] FALSE
x$not_thrown_yet("bears")
#> [1] TRUE
x$add("two")
x$add("two")
x$add("two")
x$thrown_times("two")
#> [1] 4
x$thrown_enough("two")
#> [1] TRUE
x$thrown_enough("one")
#> [1] FALSE
A simple function that throws messages
squared <- function(x) {
stopifnot(is.numeric(x))
y <- x^2
if (y > 20) message("woops, > than 20! check your numbers")
return(y)
}
foo <- function(x) {
vapply(x, function(z) squared(z), numeric(1))
}
bar <- function(x, times = 1) {
y <- ConditionKeeper$new(times = times)
on.exit(y$purge())
vapply(x, function(z) y$handle_conditions(squared(z)), numeric(1))
}
Running the function normally throws many messages
foo(1:10)
#> woops, > than 20! check your numbers
#> woops, > than 20! check your numbers
#> woops, > than 20! check your numbers
#> woops, > than 20! check your numbers
#> woops, > than 20! check your numbers
#> woops, > than 20! check your numbers
#> [1] 1 4 9 16 25 36 49 64 81 100
Using in ConditionKeeper allows you to control how many messages
are thrown
bar(x = 1:10)
#> woops, > than 20! check your numbers
#> [1] 1 4 9 16 25 36 49 64 81 100
bar(1:10, times = 3)
#> woops, > than 20! check your numbers
#>
#> woops, > than 20! check your numbers
#>
#> woops, > than 20! check your numbers
#> [1] 1 4 9 16 25 36 49 64 81 100
definitely need to work on performance
library(microbenchmark)
microbenchmark::microbenchmark(
normal = suppressMessages(foo(1:10)),
with_conditionz = suppressMessages(bar(1:10)),
times = 100
)
#> Unit: microseconds
#> expr min lq mean median uq max
#> normal 857.006 874.4165 989.1222 900.992 943.1775 2796.801
#> with_conditionz 1906.543 1947.7495 2078.4096 1998.475 2132.5750 2729.156
#> neval
#> 100
#> 100
conditionz in R doing citation(package = 'conditionz')