diff --git a/R-package/R/xgb.train.R b/R-package/R/xgb.train.R index 0841cbd69..5a7d2eb5e 100644 --- a/R-package/R/xgb.train.R +++ b/R-package/R/xgb.train.R @@ -321,6 +321,10 @@ xgb.train <- function(params = list(), data, nrounds, watchlist = list(), if (is.null(evnames) || any(evnames == "")) stop("each element of the watchlist must have a name tag") } + # Handle multiple evaluation metrics given as a list + for (m in params$eval_metric) { + params <- c(params, list(eval_metric = m)) + } # evaluation printing callback params <- c(params) diff --git a/R-package/tests/testthat/test_basic.R b/R-package/tests/testthat/test_basic.R index e052499dd..94cd1ded3 100644 --- a/R-package/tests/testthat/test_basic.R +++ b/R-package/tests/testthat/test_basic.R @@ -232,12 +232,20 @@ test_that("train and predict RF with softprob", { test_that("use of multiple eval metrics works", { expect_output( bst <- xgboost(data = train$data, label = train$label, max_depth = 2, - eta = 1, nthread = 2, nrounds = 2, objective = "binary:logistic", - eval_metric = 'error', eval_metric = 'auc', eval_metric = "logloss") + eta = 1, nthread = 2, nrounds = 2, objective = "binary:logistic", + eval_metric = 'error', eval_metric = 'auc', eval_metric = "logloss") , "train-error.*train-auc.*train-logloss") expect_false(is.null(bst$evaluation_log)) expect_equal(dim(bst$evaluation_log), c(2, 4)) expect_equal(colnames(bst$evaluation_log), c("iter", "train_error", "train_auc", "train_logloss")) + expect_output( + bst2 <- xgboost(data = train$data, label = train$label, max_depth = 2, + eta = 1, nthread = 2, nrounds = 2, objective = "binary:logistic", + eval_metric = list("error", "auc", "logloss")) + , "train-error.*train-auc.*train-logloss") + expect_false(is.null(bst2$evaluation_log)) + expect_equal(dim(bst2$evaluation_log), c(2, 4)) + expect_equal(colnames(bst2$evaluation_log), c("iter", "train_error", "train_auc", "train_logloss")) })