diff --git a/R-package/tests/testthat/test_dmatrix.R b/R-package/tests/testthat/test_dmatrix.R index efc0ca0d6..304f0e873 100644 --- a/R-package/tests/testthat/test_dmatrix.R +++ b/R-package/tests/testthat/test_dmatrix.R @@ -77,6 +77,18 @@ test_that("xgb.DMatrix: slice, dim", { expect_equal(getinfo(dsub1, 'label'), getinfo(dsub2, 'label')) }) +test_that("xgb.DMatrix: slice, trailing empty rows", { + data(agaricus.train, package='xgboost') + train_data <- agaricus.train$data + train_label <- agaricus.train$label + dtrain <- xgb.DMatrix(data=train_data, label=train_label) + slice(dtrain, 6513L) + train_data[6513, ] <- 0 + dtrain <- xgb.DMatrix(data=train_data, label=train_label) + slice(dtrain, 6513L) + expect_equal(nrow(dtrain), 6513) +}) + test_that("xgb.DMatrix: colnames", { dtest <- xgb.DMatrix(test_data, label=test_label) expect_equal(colnames(dtest), colnames(test_data)) diff --git a/src/c_api/c_api.cc b/src/c_api/c_api.cc index 77822c294..c64bed42e 100644 --- a/src/c_api/c_api.cc +++ b/src/c_api/c_api.cc @@ -332,7 +332,12 @@ XGB_DLL int XGDMatrixCreateFromCSCEx(const size_t* col_ptr, mat.info.num_row_ = mat.page_.offset.size() - 1; if (num_row > 0) { CHECK_LE(mat.info.num_row_, num_row); + // provision for empty rows at the bottom of matrix + for (uint64_t i = mat.info.num_row_; i < static_cast(num_row); ++i) { + mat.page_.offset.push_back(mat.page_.offset.back()); + } mat.info.num_row_ = num_row; + CHECK_EQ(mat.info.num_row_, mat.page_.offset.size() - 1); // sanity check } mat.info.num_col_ = ncol; mat.info.num_nonzero_ = nelem;