Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions NEWS.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,10 @@
# tune (development version)

* The package will now log a backtrace for errors and warnings that
occur during tuning. When a tuning process encounters issues, see the new
`trace` column in the `collect_notes(.Last.tune.result)` output to find
precisely where the error occurred (#873).

# tune 1.2.0

## New Features
Expand Down
5 changes: 4 additions & 1 deletion R/grid_code_paths.R
Original file line number Diff line number Diff line change
Expand Up @@ -354,7 +354,10 @@ tune_grid_loop_iter <- function(split,
out_all_outcome_names <- list()
out_notes <-
tibble::new_tibble(list(
location = character(0), type = character(0), note = character(0)
location = character(0),
type = character(0),
note = character(0),
trace = list()
))

model_params <- vctrs::vec_slice(params, params$source == "model_spec")
Expand Down
23 changes: 21 additions & 2 deletions R/handlers.R
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,29 @@
catcher <- function(expr) {
signals <- list()
add_cond <- function(cnd) {
signals <<- append(signals, list(cnd))
signals <<- append(signals, list(rlang::cnd_entrace(cnd)))
rlang::cnd_muffle(cnd)
}

res <- try(withCallingHandlers(warning = add_cond, expr), silent = TRUE)
res <-
rlang::try_fetch(
expr,
warning = add_cond,
error = function(e) {
structure(
catch_message(e),
class = "try-error",
# if a simple error, add a traceback.
# otherwise, pass the condition right along.
condition = rlang::`%||%`(rlang::cnd_entrace(e), e)
)
}
)

list(res = res, signals = signals)
}

# A simplified version of the error handler supplied in `try()` source
catch_message <- function(e) {
paste0("Error in ", deparse(conditionCall(e)), ": ", conditionMessage(e), "\n")
}
11 changes: 7 additions & 4 deletions R/logging.R
Original file line number Diff line number Diff line change
Expand Up @@ -307,8 +307,10 @@ log_problems <- function(notes, control, split, loc, res, bad_only = FALSE) {
wrn_msg <- unique(wrn_msg)
wrn_msg <- paste(wrn_msg, collapse = ", ")

wrn_traces <- purrr::map(wrn, `$`, "trace")

wrn_msg <- tibble::new_tibble(
list(location = loc, type = "warning", note = wrn_msg),
list(location = loc, type = "warning", note = wrn_msg, trace = list(wrn_traces[[1]])),
Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Note that traces are a tibble subclass.

Each row in the output of this function is a given place in evaluating a resample fold, e.g. Fold1 preprocessor 1/1, model 1/1 (predictions).

It's possible to have more than one warning appear in a given model fit or prediction or metric calculation, so we collapse messages (see above) into one string in that case. For traces, we could just pass all of list(wrn_traces), but that would mean that, to be type-stable, we'd have to list(list(err_cnd$trace)) for errors.

Said another way, right now, to extract the second logged trace, you could write collect_notes()$trace[[2]]. If we supplied all of the warning traces in this line and changed the format for errors to be type-stable, you'd have to write collect_notes()$trace[[2]][[1]]. This [[-fu feels contrary to the point of the collect_*() functions.

This approach banks on the fact that it's likely not useful to have a backtrace for each warning that occurs in a single call to e.g. predict.xgb(); the first is sufficient to help you drop into the right environment to track down an issue.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'd go with clarity over completeness here and only use the first trace as suggested. If we later realize that this does not get us to a useful debugging point often enough, we can still extend it.

nrow = 1
)

Expand All @@ -322,15 +324,16 @@ log_problems <- function(notes, control, split, loc, res, bad_only = FALSE) {
}
}
if (inherits(res$res, "try-error")) {
err_cnd <- attr(res$res, "condition")
if (should_catalog) {
err_msg <- conditionMessage(attr(res$res, "condition"))
err_msg <- conditionMessage(err_cnd)
} else {
err_msg <- as.character(attr(res$res, "condition"))
err_msg <- as.character(err_cnd)
err_msg <- gsub("\n$", "", err_msg)
}

err_msg <- tibble::new_tibble(
list(location = loc, type = "error", note = err_msg),
list(location = loc, type = "error", note = err_msg, trace = list(err_cnd$trace)),
nrow = 1
)

Expand Down
7 changes: 6 additions & 1 deletion R/tune_bayes.R
Original file line number Diff line number Diff line change
Expand Up @@ -374,7 +374,12 @@ tune_bayes_workflow <- function(object,
for (i in seq_len(iter) + score_card$overall_iter) {
.notes <-
tibble::new_tibble(
list(location = character(0), type = character(0), note = character(0)),
list(
location = character(0),
type = character(0),
note = character(0),
trace = list()
),
nrow = 0
)

Expand Down
60 changes: 30 additions & 30 deletions tests/testthat/_snaps/bayes.md
Original file line number Diff line number Diff line change
Expand Up @@ -148,16 +148,16 @@
# A tibble: 30 x 5
splits id .metrics .notes .iter
<list> <chr> <list> <list> <int>
1 <split [28/4]> Fold01 <tibble [4 x 5]> <tibble [0 x 3]> 0
2 <split [28/4]> Fold02 <tibble [4 x 5]> <tibble [0 x 3]> 0
3 <split [29/3]> Fold03 <tibble [4 x 5]> <tibble [0 x 3]> 0
4 <split [29/3]> Fold04 <tibble [4 x 5]> <tibble [0 x 3]> 0
5 <split [29/3]> Fold05 <tibble [4 x 5]> <tibble [0 x 3]> 0
6 <split [29/3]> Fold06 <tibble [4 x 5]> <tibble [0 x 3]> 0
7 <split [29/3]> Fold07 <tibble [4 x 5]> <tibble [0 x 3]> 0
8 <split [29/3]> Fold08 <tibble [4 x 5]> <tibble [0 x 3]> 0
9 <split [29/3]> Fold09 <tibble [4 x 5]> <tibble [0 x 3]> 0
10 <split [29/3]> Fold10 <tibble [4 x 5]> <tibble [0 x 3]> 0
1 <split [28/4]> Fold01 <tibble [4 x 5]> <tibble [0 x 4]> 0
2 <split [28/4]> Fold02 <tibble [4 x 5]> <tibble [0 x 4]> 0
3 <split [29/3]> Fold03 <tibble [4 x 5]> <tibble [0 x 4]> 0
4 <split [29/3]> Fold04 <tibble [4 x 5]> <tibble [0 x 4]> 0
5 <split [29/3]> Fold05 <tibble [4 x 5]> <tibble [0 x 4]> 0
6 <split [29/3]> Fold06 <tibble [4 x 5]> <tibble [0 x 4]> 0
7 <split [29/3]> Fold07 <tibble [4 x 5]> <tibble [0 x 4]> 0
8 <split [29/3]> Fold08 <tibble [4 x 5]> <tibble [0 x 4]> 0
9 <split [29/3]> Fold09 <tibble [4 x 5]> <tibble [0 x 4]> 0
10 <split [29/3]> Fold10 <tibble [4 x 5]> <tibble [0 x 4]> 0
# i 20 more rows

---
Expand Down Expand Up @@ -199,16 +199,16 @@
# A tibble: 30 x 5
splits id .metrics .notes .iter
<list> <chr> <list> <list> <int>
1 <split [28/4]> Fold01 <tibble [4 x 5]> <tibble [0 x 3]> 0
2 <split [28/4]> Fold02 <tibble [4 x 5]> <tibble [0 x 3]> 0
3 <split [29/3]> Fold03 <tibble [4 x 5]> <tibble [0 x 3]> 0
4 <split [29/3]> Fold04 <tibble [4 x 5]> <tibble [0 x 3]> 0
5 <split [29/3]> Fold05 <tibble [4 x 5]> <tibble [0 x 3]> 0
6 <split [29/3]> Fold06 <tibble [4 x 5]> <tibble [0 x 3]> 0
7 <split [29/3]> Fold07 <tibble [4 x 5]> <tibble [0 x 3]> 0
8 <split [29/3]> Fold08 <tibble [4 x 5]> <tibble [0 x 3]> 0
9 <split [29/3]> Fold09 <tibble [4 x 5]> <tibble [0 x 3]> 0
10 <split [29/3]> Fold10 <tibble [4 x 5]> <tibble [0 x 3]> 0
1 <split [28/4]> Fold01 <tibble [4 x 5]> <tibble [0 x 4]> 0
2 <split [28/4]> Fold02 <tibble [4 x 5]> <tibble [0 x 4]> 0
3 <split [29/3]> Fold03 <tibble [4 x 5]> <tibble [0 x 4]> 0
4 <split [29/3]> Fold04 <tibble [4 x 5]> <tibble [0 x 4]> 0
5 <split [29/3]> Fold05 <tibble [4 x 5]> <tibble [0 x 4]> 0
6 <split [29/3]> Fold06 <tibble [4 x 5]> <tibble [0 x 4]> 0
7 <split [29/3]> Fold07 <tibble [4 x 5]> <tibble [0 x 4]> 0
8 <split [29/3]> Fold08 <tibble [4 x 5]> <tibble [0 x 4]> 0
9 <split [29/3]> Fold09 <tibble [4 x 5]> <tibble [0 x 4]> 0
10 <split [29/3]> Fold10 <tibble [4 x 5]> <tibble [0 x 4]> 0
# i 20 more rows

---
Expand Down Expand Up @@ -374,16 +374,16 @@
# A tibble: 30 x 5
splits id .metrics .notes .iter
<list> <chr> <list> <list> <int>
1 <split [28/4]> Fold01 <tibble [4 x 5]> <tibble [0 x 3]> 0
2 <split [28/4]> Fold02 <tibble [4 x 5]> <tibble [0 x 3]> 0
3 <split [29/3]> Fold03 <tibble [4 x 5]> <tibble [0 x 3]> 0
4 <split [29/3]> Fold04 <tibble [4 x 5]> <tibble [0 x 3]> 0
5 <split [29/3]> Fold05 <tibble [4 x 5]> <tibble [0 x 3]> 0
6 <split [29/3]> Fold06 <tibble [4 x 5]> <tibble [0 x 3]> 0
7 <split [29/3]> Fold07 <tibble [4 x 5]> <tibble [0 x 3]> 0
8 <split [29/3]> Fold08 <tibble [4 x 5]> <tibble [0 x 3]> 0
9 <split [29/3]> Fold09 <tibble [4 x 5]> <tibble [0 x 3]> 0
10 <split [29/3]> Fold10 <tibble [4 x 5]> <tibble [0 x 3]> 0
1 <split [28/4]> Fold01 <tibble [4 x 5]> <tibble [0 x 4]> 0
2 <split [28/4]> Fold02 <tibble [4 x 5]> <tibble [0 x 4]> 0
3 <split [29/3]> Fold03 <tibble [4 x 5]> <tibble [0 x 4]> 0
4 <split [29/3]> Fold04 <tibble [4 x 5]> <tibble [0 x 4]> 0
5 <split [29/3]> Fold05 <tibble [4 x 5]> <tibble [0 x 4]> 0
6 <split [29/3]> Fold06 <tibble [4 x 5]> <tibble [0 x 4]> 0
7 <split [29/3]> Fold07 <tibble [4 x 5]> <tibble [0 x 4]> 0
8 <split [29/3]> Fold08 <tibble [4 x 5]> <tibble [0 x 4]> 0
9 <split [29/3]> Fold09 <tibble [4 x 5]> <tibble [0 x 4]> 0
10 <split [29/3]> Fold10 <tibble [4 x 5]> <tibble [0 x 4]> 0
# i 20 more rows

# tune model only - failure in recipe is caught elegantly
Expand Down
20 changes: 10 additions & 10 deletions tests/testthat/_snaps/censored-reg.md
Original file line number Diff line number Diff line change
Expand Up @@ -30,16 +30,16 @@
# A tibble: 10 x 4
splits id .metrics .notes
<list> <chr> <list> <list>
1 <split [164/20]> Fold01 <tibble [1 x 4]> <tibble [0 x 3]>
2 <split [165/19]> Fold02 <tibble [1 x 4]> <tibble [0 x 3]>
3 <split [165/19]> Fold03 <tibble [1 x 4]> <tibble [0 x 3]>
4 <split [166/18]> Fold04 <tibble [1 x 4]> <tibble [0 x 3]>
5 <split [166/18]> Fold05 <tibble [1 x 4]> <tibble [0 x 3]>
6 <split [166/18]> Fold06 <tibble [1 x 4]> <tibble [0 x 3]>
7 <split [166/18]> Fold07 <tibble [1 x 4]> <tibble [0 x 3]>
8 <split [166/18]> Fold08 <tibble [1 x 4]> <tibble [0 x 3]>
9 <split [166/18]> Fold09 <tibble [1 x 4]> <tibble [0 x 3]>
10 <split [166/18]> Fold10 <tibble [1 x 4]> <tibble [0 x 3]>
1 <split [164/20]> Fold01 <tibble [1 x 4]> <tibble [0 x 4]>
2 <split [165/19]> Fold02 <tibble [1 x 4]> <tibble [0 x 4]>
3 <split [165/19]> Fold03 <tibble [1 x 4]> <tibble [0 x 4]>
4 <split [166/18]> Fold04 <tibble [1 x 4]> <tibble [0 x 4]>
5 <split [166/18]> Fold05 <tibble [1 x 4]> <tibble [0 x 4]>
6 <split [166/18]> Fold06 <tibble [1 x 4]> <tibble [0 x 4]>
7 <split [166/18]> Fold07 <tibble [1 x 4]> <tibble [0 x 4]>
8 <split [166/18]> Fold08 <tibble [1 x 4]> <tibble [0 x 4]>
9 <split [166/18]> Fold09 <tibble [1 x 4]> <tibble [0 x 4]>
10 <split [166/18]> Fold10 <tibble [1 x 4]> <tibble [0 x 4]>

---

Expand Down
46 changes: 23 additions & 23 deletions tests/testthat/_snaps/extract.md
Original file line number Diff line number Diff line change
Expand Up @@ -49,9 +49,9 @@
# A tibble: 3 x 5
splits id .metrics .notes .extracts
<list> <chr> <list> <list> <list>
1 <split [32/13]> Bootstrap1 <tibble [2 x 4]> <tibble [1 x 3]> <tibble [1 x 2]>
2 <split [32/17]> Bootstrap2 <tibble [2 x 4]> <tibble [1 x 3]> <tibble [1 x 2]>
3 <split [32/11]> Bootstrap3 <tibble [2 x 4]> <tibble [1 x 3]> <tibble [1 x 2]>
1 <split [32/13]> Bootstrap1 <tibble [2 x 4]> <tibble [1 x 4]> <tibble [1 x 2]>
2 <split [32/17]> Bootstrap2 <tibble [2 x 4]> <tibble [1 x 4]> <tibble [1 x 2]>
3 <split [32/11]> Bootstrap3 <tibble [2 x 4]> <tibble [1 x 4]> <tibble [1 x 2]>

There were issues with some computations:

Expand All @@ -69,9 +69,9 @@
# A tibble: 3 x 5
splits id .metrics .notes .extracts
<list> <chr> <list> <list> <list>
1 <split [32/13]> Bootstrap1 <tibble [2 x 4]> <tibble [1 x 3]> <tibble [1 x 2]>
2 <split [32/17]> Bootstrap2 <tibble [2 x 4]> <tibble [1 x 3]> <tibble [1 x 2]>
3 <split [32/11]> Bootstrap3 <tibble [2 x 4]> <tibble [1 x 3]> <tibble [1 x 2]>
1 <split [32/13]> Bootstrap1 <tibble [2 x 4]> <tibble [1 x 4]> <tibble [1 x 2]>
2 <split [32/17]> Bootstrap2 <tibble [2 x 4]> <tibble [1 x 4]> <tibble [1 x 2]>
3 <split [32/11]> Bootstrap3 <tibble [2 x 4]> <tibble [1 x 4]> <tibble [1 x 2]>

There were issues with some computations:

Expand All @@ -89,9 +89,9 @@
# A tibble: 3 x 5
splits id .metrics .notes .extracts
<list> <chr> <list> <list> <list>
1 <split [32/13]> Bootstrap1 <tibble [2 x 4]> <tibble [2 x 3]> <tibble [1 x 2]>
2 <split [32/17]> Bootstrap2 <tibble [2 x 4]> <tibble [2 x 3]> <tibble [1 x 2]>
3 <split [32/11]> Bootstrap3 <tibble [2 x 4]> <tibble [2 x 3]> <tibble [1 x 2]>
1 <split [32/13]> Bootstrap1 <tibble [2 x 4]> <tibble [2 x 4]> <tibble [1 x 2]>
2 <split [32/17]> Bootstrap2 <tibble [2 x 4]> <tibble [2 x 4]> <tibble [1 x 2]>
3 <split [32/11]> Bootstrap3 <tibble [2 x 4]> <tibble [2 x 4]> <tibble [1 x 2]>

There were issues with some computations:

Expand All @@ -110,9 +110,9 @@
# A tibble: 3 x 5
splits id .metrics .notes .extracts
<list> <chr> <list> <list> <list>
1 <split [32/13]> Bootstrap1 <tibble [2 x 4]> <tibble [1 x 3]> <tibble [1 x 2]>
2 <split [32/17]> Bootstrap2 <tibble [2 x 4]> <tibble [0 x 3]> <tibble [1 x 2]>
3 <split [32/11]> Bootstrap3 <tibble [2 x 4]> <tibble [0 x 3]> <tibble [1 x 2]>
1 <split [32/13]> Bootstrap1 <tibble [2 x 4]> <tibble [1 x 4]> <tibble [1 x 2]>
2 <split [32/17]> Bootstrap2 <tibble [2 x 4]> <tibble [0 x 4]> <tibble [1 x 2]>
3 <split [32/11]> Bootstrap3 <tibble [2 x 4]> <tibble [0 x 4]> <tibble [1 x 2]>

There were issues with some computations:

Expand All @@ -125,17 +125,17 @@
Code
res_extract_warning$.notes[[1]]
Output
# A tibble: 1 x 3
location type note
<chr> <chr> <chr>
1 preprocessor 1/1, model 1/1 (extracts) warning AHHH
# A tibble: 1 x 4
location type note trace
<chr> <chr> <chr> <list>
1 preprocessor 1/1, model 1/1 (extracts) warning AHHH <rlng_trc [46 x 5]>

---

Code
res_extract_error$.extracts[[1]]$.extracts[[1]]
Output
[1] "Error in extractor(object) : AHHH\n"
[1] "Error in extractor(object): AHHH\n"
attr(,"class")
[1] "try-error"
attr(,"condition")
Expand All @@ -146,17 +146,17 @@
Code
res_extract_error$.notes[[1]]
Output
# A tibble: 1 x 3
location type note
<chr> <chr> <chr>
1 preprocessor 1/1, model 1/1 (extracts) error Error in extractor(object): AHHH
# A tibble: 1 x 4
location type note trace
<chr> <chr> <chr> <list>
1 preprocessor 1/1, model 1/1 (extracts) error Error in extractor(ob~ <rlng_trc>

---

Code
res_extract_both$.extracts[[1]]$.extracts[[1]]
Output
[1] "Error in extractor(object) : AHHH\n"
[1] "Error in extractor(object): AHHH\n"
attr(,"class")
[1] "try-error"
attr(,"condition")
Expand All @@ -167,7 +167,7 @@
Code
res_extract_error_once$.extracts[[1]]$.extracts[[1]]
Output
[1] "Error in extractor(object) : oh no\n"
[1] "Error in extractor(object): oh no\n"
attr(,"class")
[1] "try-error"
attr(,"condition")
Expand Down
20 changes: 10 additions & 10 deletions tests/testthat/_snaps/grid.md
Original file line number Diff line number Diff line change
Expand Up @@ -66,14 +66,14 @@
# A tibble: 10 x 4
splits id .metrics .notes
<list> <chr> <list> <list>
1 <split [28/4]> Fold01 <tibble [4 x 5]> <tibble [0 x 3]>
2 <split [28/4]> Fold02 <tibble [4 x 5]> <tibble [0 x 3]>
3 <split [29/3]> Fold03 <tibble [4 x 5]> <tibble [0 x 3]>
4 <split [29/3]> Fold04 <tibble [4 x 5]> <tibble [0 x 3]>
5 <split [29/3]> Fold05 <tibble [4 x 5]> <tibble [0 x 3]>
6 <split [29/3]> Fold06 <tibble [4 x 5]> <tibble [0 x 3]>
7 <split [29/3]> Fold07 <tibble [4 x 5]> <tibble [0 x 3]>
8 <split [29/3]> Fold08 <tibble [4 x 5]> <tibble [0 x 3]>
9 <split [29/3]> Fold09 <tibble [4 x 5]> <tibble [0 x 3]>
10 <split [29/3]> Fold10 <tibble [4 x 5]> <tibble [0 x 3]>
1 <split [28/4]> Fold01 <tibble [4 x 5]> <tibble [0 x 4]>
2 <split [28/4]> Fold02 <tibble [4 x 5]> <tibble [0 x 4]>
3 <split [29/3]> Fold03 <tibble [4 x 5]> <tibble [0 x 4]>
4 <split [29/3]> Fold04 <tibble [4 x 5]> <tibble [0 x 4]>
5 <split [29/3]> Fold05 <tibble [4 x 5]> <tibble [0 x 4]>
6 <split [29/3]> Fold06 <tibble [4 x 5]> <tibble [0 x 4]>
7 <split [29/3]> Fold07 <tibble [4 x 5]> <tibble [0 x 4]>
8 <split [29/3]> Fold08 <tibble [4 x 5]> <tibble [0 x 4]>
9 <split [29/3]> Fold09 <tibble [4 x 5]> <tibble [0 x 4]>
10 <split [29/3]> Fold10 <tibble [4 x 5]> <tibble [0 x 4]>

2 changes: 1 addition & 1 deletion tests/testthat/_snaps/last-fit.md
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@
# A tibble: 1 x 6
splits id .metrics .notes .predictions .workflow
<list> <chr> <list> <list> <list> <list>
1 <split [24/8]> train/test split <tibble [2 x 4]> <tibble [0 x 3]> <tibble [8 x 4]> <workflow>
1 <split [24/8]> train/test split <tibble [2 x 4]> <tibble [0 x 4]> <tibble [8 x 4]> <workflow>

# argument order gives errors for recipe/formula

Expand Down
8 changes: 4 additions & 4 deletions tests/testthat/_snaps/logging.md
Original file line number Diff line number Diff line change
Expand Up @@ -71,16 +71,16 @@
# log issues

Code
expect_equal(tune:::log_problems(note_1, ctrl_f, rs, "toledo", res_1, bad_only = FALSE),
dplyr::bind_rows(note_1, note_2))
problems_1 <- tune:::log_problems(note_1, ctrl_f, rs, "toledo", res_1,
bad_only = FALSE)
Message
x Fold01: toledo: Error in log("a"): non-numeric argument to mathematical function

---

Code
expect_equal(tune:::log_problems(note_1, ctrl_f, rs, "toledo", res_3, bad_only = FALSE),
dplyr::bind_rows(note_1, note_3))
problems_2 <- tune:::log_problems(note_1, ctrl_f, rs, "toledo", res_3,
bad_only = FALSE)
Message
! Fold01: toledo: NaNs produced

Expand Down
8 changes: 4 additions & 4 deletions tests/testthat/_snaps/resample.md
Original file line number Diff line number Diff line change
Expand Up @@ -92,8 +92,8 @@
# A tibble: 2 x 4
splits id .metrics .notes
<list> <chr> <list> <list>
1 <split [16/16]> Fold1 <tibble [2 x 4]> <tibble [0 x 3]>
2 <split [16/16]> Fold2 <tibble [2 x 4]> <tibble [0 x 3]>
1 <split [16/16]> Fold1 <tibble [2 x 4]> <tibble [0 x 4]>
2 <split [16/16]> Fold2 <tibble [2 x 4]> <tibble [0 x 4]>

# argument order gives errors for recipe/formula

Expand Down Expand Up @@ -126,8 +126,8 @@
# A tibble: 2 x 4
splits id .metrics .notes
<list> <chr> <list> <list>
1 <split [16/16]> Fold1 <tibble [2 x 4]> <tibble [0 x 3]>
2 <split [16/16]> Fold2 <tibble [2 x 4]> <tibble [0 x 3]>
1 <split [16/16]> Fold1 <tibble [2 x 4]> <tibble [0 x 4]>
2 <split [16/16]> Fold2 <tibble [2 x 4]> <tibble [0 x 4]>

# `fit_resamples()` when objects need tuning

Expand Down
Loading