Skip to content

Commit 07c336f

Browse files
committed
perf: directly use set() with a loop
1 parent a2e01f9 commit 07c336f

File tree

4 files changed

+59
-56
lines changed

4 files changed

+59
-56
lines changed

DESCRIPTION

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ Depends:
2828
R (>= 4.1.0)
2929
Imports:
3030
checkmate,
31-
data.table (>= 1.16.0),
31+
data.table,
3232
lgr,
3333
mlr3misc (>= 0.14.0),
3434
paradox,

R/PipeOpFDAInterpol.R

Lines changed: 17 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -106,26 +106,26 @@ PipeOpFDAInterpol = R6Class("PipeOpFDAInterpol",
106106
if (length(grid) > 1L && !has_left && !has_right) {
107107
max_grid = max(grid)
108108
min_grid = min(grid)
109-
dt[,
110-
names(.SD) := map(.SD, function(x) {
111-
domain = tf::tf_domain(x)
112-
if (min_grid < domain[[1L]] || max_grid > domain[[2L]]) {
113-
stopf("The grid must be within the range of the domain.")
114-
}
115-
invoke(tf::tfd, data = x, arg = grid, .args = list(evaluator = evaluator))
116-
})
117-
]
109+
for (j in seq_along(dt)) {
110+
x = dt[[j]]
111+
domain = tf::tf_domain(x)
112+
if (min_grid < domain[[1L]] || max_grid > domain[[2L]]) {
113+
stopf("The grid must be within the range of the domain.")
114+
}
115+
set(dt, j = j, value = invoke(tf::tfd, data = x, arg = grid, .args = list(evaluator = evaluator)))
116+
}
118117
return(dt)
119118
}
120119
arg = seq(left, right, length.out = grid)
121-
dt[,
122-
names(.SD) := map(.SD, function(x) invoke(tf::tfd, data = x, arg = arg, .args = list(evaluator = evaluator)))
123-
]
120+
for (j in seq_along(dt)) {
121+
set(dt, j = j, value = invoke(tf::tfd, data = dt[[j]], arg = arg, .args = list(evaluator = evaluator)))
122+
}
124123
return(dt)
125124
}
126125

127-
dt[,
128-
names(.SD) := map(.SD, function(x) {
126+
for (j in seq_along(dt)) {
127+
x = dt[[j]]
128+
if (tf::is_irreg(x)) {
129129
arg = tf::tf_arg(x)
130130
arg = switch(
131131
grid,
@@ -138,10 +138,9 @@ PipeOpFDAInterpol = R6Class("PipeOpFDAInterpol",
138138
arg[seq(which(lower == arg), which(upper == arg))]
139139
}
140140
)
141-
invoke(tf::tfd, data = x, arg = arg, .args = list(evaluator = evaluator))
142-
}),
143-
.SDcols = tf::is_irreg
144-
]
141+
set(dt, j = j, value = invoke(tf::tfd, data = x, arg = arg, .args = list(evaluator = evaluator)))
142+
}
143+
}
145144
dt
146145
}
147146
)

R/PipeOpFDAScaleRange.R

Lines changed: 30 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -51,40 +51,40 @@ PipeOpFDAScaleRange = R6Class("PipeOpFDAScaleRange",
5151
.train_dt = function(dt, levels, target) {
5252
pars = self$param_set$get_values(tags = "train")
5353

54-
dt[,
55-
names(.SD) := imap(.SD, function(x, nm) {
56-
domain = tf::tf_domain(x)
57-
scale = (pars$upper - pars$lower) / (domain[2L] - domain[1L])
58-
offset = -domain[1L] * scale + pars$lower
59-
self$state[[nm]] = list(domain = domain, scale = scale, offset = offset)
54+
for (j in names(dt)) {
55+
x = dt[[j]]
56+
domain = tf::tf_domain(x)
57+
scale = (pars$upper - pars$lower) / (domain[2L] - domain[1L])
58+
offset = -domain[1L] * scale + pars$lower
59+
self$state[[j]] = list(domain = domain, scale = scale, offset = offset)
6060

61-
args = tf::tf_arg(x)
62-
if (tf::is_reg(x)) {
63-
new_args = offset + args * scale
64-
} else {
65-
new_args = map(args, function(arg) offset + arg * scale)
66-
}
67-
invoke(tf::tfd, data = tf::tf_evaluations(x), arg = new_args)
68-
})
69-
]
61+
args = tf::tf_arg(x)
62+
if (tf::is_reg(x)) {
63+
new_args = offset + args * scale
64+
} else {
65+
new_args = map(args, function(arg) offset + arg * scale)
66+
}
67+
set(dt, j = j, value = invoke(tf::tfd, data = tf::tf_evaluations(x), arg = new_args))
68+
}
69+
dt
7070
},
7171

7272
.predict_dt = function(dt, levels) {
73-
dt[,
74-
names(.SD) := imap(.SD, function(x, nm) {
75-
trafo = self$state[[nm]]
76-
if (!all(trafo$domain == tf::tf_domain(x))) {
77-
stopf("Domain of new data does not match the domain of the training data.")
78-
}
79-
args = tf::tf_arg(x)
80-
if (tf::is_reg(x)) {
81-
new_args = trafo$offset + args * trafo$scale
82-
} else {
83-
new_args = map(args, function(arg) trafo$offset + arg * trafo$scale)
84-
}
85-
invoke(tf::tfd, data = tf::tf_evaluations(x), arg = new_args)
86-
})
87-
]
73+
for (j in names(dt)) {
74+
x = dt[[j]]
75+
trafo = self$state[[j]]
76+
if (!all(trafo$domain == tf::tf_domain(x))) {
77+
stopf("Domain of new data does not match the domain of the training data.")
78+
}
79+
args = tf::tf_arg(x)
80+
if (tf::is_reg(x)) {
81+
new_args = trafo$offset + args * trafo$scale
82+
} else {
83+
new_args = map(args, function(arg) trafo$offset + arg * trafo$scale)
84+
}
85+
set(dt, j = j, value = invoke(tf::tfd, data = tf::tf_evaluations(x), arg = new_args))
86+
}
87+
dt
8888
}
8989
)
9090
)

R/PipeOpFDASmooth.R

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -66,14 +66,18 @@ PipeOpFDASmooth = R6Class("PipeOpFDASmooth",
6666
pars = self$param_set$get_values()
6767

6868
if (pars$verbose) {
69-
dt[, names(.SD) := map(.SD, function(x) invoke(tf::tf_smooth, x = x, method = pars$method, .args = pars$args))]
70-
} else {
71-
dt[,
72-
names(.SD) := map(.SD, function(x) {
73-
suppressMessages(invoke(tf::tf_smooth, x = x, method = pars$method, .args = pars$args))
74-
})
75-
]
69+
for (j in seq_along(dt)) {
70+
set(dt, j = j, value = invoke(tf::tf_smooth, x = dt[[j]], method = pars$method, .args = pars$args))
71+
}
72+
return(dt)
7673
}
74+
for (j in seq_along(dt)) {
75+
set(dt,
76+
j = j,
77+
value = suppressMessages(invoke(tf::tf_smooth, x = dt[[j]], method = pars$method, .args = pars$args))
78+
)
79+
}
80+
dt
7781
}
7882
)
7983
)

0 commit comments

Comments
 (0)