-
Notifications
You must be signed in to change notification settings - Fork 327
/
pickle.R
54 lines (43 loc) · 1.62 KB
/
pickle.R
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#' Save and Load Python Objects
#'
#' Save and load Python objects.
#'
#' Python objects are serialized using the `pickle` module -- see
#' <https://docs.python.org/3/library/pickle.html> for more details.
#'
#' @param object A Python object.
#'
#' @param filename The output file name. Note that the file extension `.pickle`
#' is considered the "standard" extension for serialized Python objects
#' as created by the `pickle` module.
#'
#' @param pickle The "pickle" implementation to use. Defaults to `"pickle`",
#' but other compatible Python "pickle" implementations (e.g. `"cPickle"`)
#' could be used as well.
#'
#' @param ... Optional arguments, to be passed to the `pickle` module's
#' `dump()` and `load()` functions.
#'
#' @param convert Bool. Whether the loaded pickle object should be converted to
#' an R object.
#'
#' @export
py_save_object <- function(object, filename, pickle = "pickle", ...) {
filename <- normalizePath(filename, winslash = "/", mustWork = FALSE)
builtins <- import_builtins()
pickle <- import(pickle, convert = TRUE)
handle <- builtins$open(filename, "wb")
on.exit(handle$close(), add = TRUE)
pickle$dump(object, handle, protocol = pickle$HIGHEST_PROTOCOL, ...)
}
#' @rdname py_save_object
#' @export
py_load_object <- function(filename, pickle = "pickle", ..., convert = TRUE) {
filename <- normalizePath(filename, winslash = "/", mustWork = FALSE)
builtins <- import_builtins()
pickle <- import(pickle, convert = convert)
handle <- builtins$open(filename, "rb")
on.exit(handle$close(), add = TRUE)
obj <- py_call(pickle$load, handle, ...)
py_maybe_convert(obj, convert)
}