lgb.unloader.R 2.46 KB
Newer Older
1
2
3
4
5
#' @name lgb.unloader
#' @title LightGBM unloading error fix
#' @description Attempts to unload LightGBM packages so you can remove objects cleanly without
#'              having to restart R. This is useful for instance if an object becomes stuck for no
#'              apparent reason and you do not want to restart R to fix the lost object.
6
7
8
9
10
11
12
#' @param restore Whether to reload \code{LightGBM} immediately after detaching from R.
#'                Defaults to \code{TRUE} which means automatically reload \code{LightGBM} once
#'                unloading is performed.
#' @param wipe Whether to wipe all \code{lgb.Dataset} and \code{lgb.Booster} from the global
#'             environment. Defaults to \code{FALSE} which means to not remove them.
#' @param envir The environment to perform wiping on if \code{wipe == TRUE}. Defaults to
#'              \code{.GlobalEnv} which is the global environment.
13
#'
14
#' @return NULL invisibly.
15
#'
16
17
18
19
20
21
22
23
24
25
#' @examples
#' library(lightgbm)
#' data(agaricus.train, package = "lightgbm")
#' train <- agaricus.train
#' dtrain <- lgb.Dataset(train$data, label = train$label)
#' data(agaricus.test, package = "lightgbm")
#' test <- agaricus.test
#' dtest <- lgb.Dataset.create.valid(dtrain, test$data, label = test$label)
#' params <- list(objective = "regression", metric = "l2")
#' valids <- list(test = dtest)
26
27
28
#' model <- lgb.train(
#'   params = params
#'   , data = dtrain
29
#'   , nrounds = 10L
30
#'   , valids = valids
31
32
33
#'   , min_data = 1L
#'   , learning_rate = 1.0
#'   , early_stopping_rounds = 5L
34
#' )
35
36
#'
#' \dontrun{
37
38
39
#' lgb.unloader(restore = FALSE, wipe = FALSE, envir = .GlobalEnv)
#' rm(model, dtrain, dtest) # Not needed if wipe = TRUE
#' gc() # Not needed if wipe = TRUE
40
#'
41
42
#' library(lightgbm)
#' # Do whatever you want again with LightGBM without object clashing
43
#' }
44
#'
45
46
#' @export
lgb.unloader <- function(restore = TRUE, wipe = FALSE, envir = .GlobalEnv) {
47

48
49
  # Unload package
  try(detach("package:lightgbm", unload = TRUE), silent = TRUE)
50

51
52
  # Should we wipe variables? (lgb.Booster, lgb.Dataset)
  if (wipe) {
53
    boosters <- Filter(
54
      f = function(x) {
55
56
57
58
59
        inherits(get(x, envir = envir), "lgb.Booster")
      }
      , x = ls(envir = envir)
    )
    datasets <- Filter(
60
      f = function(x) {
61
62
63
64
        inherits(get(x, envir = envir), "lgb.Dataset")
      }
      , x = ls(envir = envir)
    )
65
    rm(list = c(boosters, datasets), envir = envir)
66
67
    gc(verbose = FALSE)
  }
68

69
70
71
72
  # Load package back?
  if (restore) {
    library(lightgbm)
  }
73

74
  invisible()
75

76
}