-
-
Notifications
You must be signed in to change notification settings - Fork 25
/
assert_graph.R
126 lines (115 loc) · 3.51 KB
/
assert_graph.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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
#' @title Assertion for mlr3pipelines Graph
#'
#' @description
#' Function that checks that a given object is a `Graph` and
#' throws an error if not.
#' @param x (`any`) \cr
#' Object to check.
#' @return [`Graph`] `invisible(x)`
#' @family Graph operators
#' @export
assert_graph = function(x) {
assert_r6(x, "Graph")
}
#' @title Conversion to mlr3pipelines Graph
#'
#' @description
#' The argument is turned into a [`Graph`] if possible.
#' If `clone` is `TRUE`, a deep copy is made
#' if the incoming object is a [`Graph`] to ensure the resulting
#' object is a different reference from the incoming object.
#'
#' [`as_graph()`] is an S3 method and can therefore be implemented
#' by other packages that may add objects that can naturally be converted to [`Graph`]s.
#'
#' By default, [`as_graph()`] tries to
#' * apply [`gunion()`] to `x` if it is a `list`, which recursively applies [`as_graph()`] to all list elements first
#' * create a [`Graph`] with only one element if `x` is a [`PipeOp`] or can be converted to one using [`as_pipeop()`].
#'
#' @param x (`any`) \cr
#' Object to convert.
#' @param clone (`logical(1)`) \cr
#' Whether to return a (deep copied) clone if `x` is a Graph.
#' @return [`Graph`] `x` or a deep clone of it.
#' @family Graph operators
#' @export
as_graph = function(x, clone = FALSE) {
UseMethod("as_graph")
}
#' @export
as_graph.default = function(x, clone = TRUE) {
# different default than other methods for backwards compatibility
# previously $add_pipeop() always cloned its input
Graph$new()$add_pipeop(x, clone = clone)
}
#' @export
as_graph.list = function(x, clone = FALSE) {
if (!clone && length(x) == 1) {
return(as_graph(x[[1]], clone = clone))
}
gunion(x) # gunion itself will convert individual members of x
}
#' @export
as_graph.Graph = function(x, clone = FALSE) {
if (clone) {
x = x$clone(deep = TRUE)
}
x
}
#' @title Assertion for mlr3pipelines PipeOp
#'
#' @description
#' Function that checks that a given object is a `PipeOp` and
#' throws an error if not.
#' @param x (`any`) \cr
#' Object to check.
#' @return [`PipeOp`] `invisible(x)`
#' @family Graph operators
#' @export
assert_pipeop = function(x) {
assert_r6(x, "PipeOp")
invisible(x)
}
#' @title Conversion to mlr3pipelines PipeOp
#'
#' @description
#' The argument is turned into a [`PipeOp`]
#' if possible.
#' If `clone` is `TRUE`, a deep copy is made
#' if the incoming object is a [`PipeOp`] to ensure the resulting
#' object is a different reference from the incoming object.
#'
#' [`as_pipeop()`] is an S3 method and can therefore be implemented by other packages
#' that may add objects that can naturally be converted to [`PipeOp`]s. Objects that
#' can be converted are for example [`Learner`][mlr3::Learner] (using [`PipeOpLearner`]) or
#' [`Filter`][mlr3filters::Filter] (using [`PipeOpFilter`]).
#'
#' @param x (`any`) \cr
#' Object to convert.
#' @param clone (`logical(1)`) \cr
#' Whether to return a (deep copied) clone if `x` is a PipeOp.
#' @return [`PipeOp`] `x` or a deep clone of it.
#' @family Graph operators
#' @export
as_pipeop = function(x, clone = FALSE) {
UseMethod("as_pipeop")
}
#' @export
as_pipeop.default = function(x, clone = FALSE) {
stopf("%s can not be converted to PipeOp", deparse(substitute(x))[1])
}
#' @export
as_pipeop.PipeOp = function(x, clone = FALSE) {
if (clone) {
x = x$clone(deep = TRUE)
}
x
}
#' @export
as_pipeop.Learner = function(x, clone = FALSE) {
PipeOpLearner$new(x)
}
#' @export
as_pipeop.Filter = function(x, clone = FALSE) {
PipeOpFilter$new(x)
}