-
-
Notifications
You must be signed in to change notification settings - Fork 39
Expand file tree
/
Copy pathdplyr_verbs.r
More file actions
305 lines (236 loc) · 7.76 KB
/
Copy pathdplyr_verbs.r
File metadata and controls
305 lines (236 loc) · 7.76 KB
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
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
#' The dplyr verbs implemented for disk.frame
#' @description Please see the dplyr document for their usage. Please note
#' `chunk_arrange` performs the actions within each chunk
#' @export
#' @importFrom dplyr select rename filter mutate transmute arrange do groups
#' group_by group_by glimpse summarise
#' @param ... Same as the dplyr functions
#' @param .data a disk.frame
#' @rdname dplyr_verbs
#' @family dplyr verbs
#' @examples
#' library(dplyr)
#' cars.df = as.disk.frame(cars)
#' mult = 2
#'
#' # use all any of the supported dplyr
#' cars2 = cars.df %>%
#' select(speed) %>%
#' mutate(speed2 = speed * mult) %>%
#' filter(speed < 50) %>%
#' rename(speed1 = speed) %>%
#' collect
#'
#' # clean up cars.df
#' delete(cars.df)
select.disk.frame <- function(.data, ...) {
quo_dotdotdot = rlang::enquos(...)
cmap(.data, ~{
code = rlang::quo(dplyr::select(.x, !!!quo_dotdotdot))
rlang::eval_tidy(code)
}, lazy = TRUE)
}
#' Kept for backwards-compatibility to be removed in 0.3
#' @export
create_dplyr_mapper = function() {
stop("create_dplyr_mapper has been deprecated. Please use create_chunk_mapper instead")
}
#' @export
#' @rdname dplyr_verbs
rename.disk.frame <- create_chunk_mapper(dplyr::rename)
#' @export
#' @rdname dplyr_verbs
filter.disk.frame <- create_chunk_mapper(dplyr::filter)
#' @export
#' @rdname dplyr_verbs
#' @importFrom dplyr filter_all
filter_all.disk.frame <- create_chunk_mapper(dplyr::filter_all)
#' @export
#' @rdname dplyr_verbs
#' @importFrom dplyr filter_if
filter_if.disk.frame <- create_chunk_mapper(dplyr::filter_if)
#' @export
#' @rdname dplyr_verbs
#' @importFrom dplyr filter_at
filter_at.disk.frame <- create_chunk_mapper(dplyr::filter_at)
#' @export
#' @rdname dplyr_verbs
#' @importFrom future getGlobalsAndPackages
#' @importFrom rlang eval_tidy quo enquos
#' @importFrom dplyr mutate
mutate.disk.frame <- create_chunk_mapper(dplyr::mutate)
#' @export
#' @importFrom dplyr transmute
#' @rdname dplyr_verbs
transmute.disk.frame <- create_chunk_mapper(dplyr::transmute)
#' @export
#' @importFrom dplyr arrange
#' @rdname dplyr_verbs
arrange.disk.frame =create_chunk_mapper(dplyr::arrange, warning_msg="`arrange.disk.frame` is now deprecated. Please use `chunk_arrange` instead. This is in preparation for a more powerful `arrange` that sorts the whole disk.frame")
#' @export
#' @importFrom dplyr arrange
#' @rdname dplyr_verbs
chunk_arrange <- create_chunk_mapper(dplyr::arrange)
#' @export
#' @importFrom dplyr tally
#' @rdname dplyr_verbs
tally.disk.frame <- create_chunk_mapper(dplyr::tally)
#' @export
#' @importFrom dplyr count
#' @rdname dplyr_verbs
count.disk.frame <- create_chunk_mapper(dplyr::count)
# TODO family is not required is group-by
# TODO alot of these .disk.frame functions are not generic
#' @export
#' @importFrom dplyr add_count
#' @rdname dplyr_verbs
add_count.disk.frame <- create_chunk_mapper(dplyr::add_count)
#' @export
#' @importFrom dplyr add_tally
#' @rdname dplyr_verbs
add_tally.disk.frame <- create_chunk_mapper(dplyr::add_tally)
#' @export
#' @importFrom dplyr summarize
#' @rdname chunk_group_by
chunk_summarize <- create_chunk_mapper(dplyr::summarize)
#' @export
#' @rdname dplyr_verbs
#' @importFrom dplyr do
do.disk.frame <- create_chunk_mapper(dplyr::do)
#' @export
#' @rdname dplyr_verbs
#' @importFrom dplyr group_by_all
chunk_group_by_all.disk.frame <- create_chunk_mapper(dplyr::group_by_all)
#' @export
#' @rdname dplyr_verbs
#' @importFrom dplyr group_by_at
chunk_group_by_at.disk.frame <- create_chunk_mapper(dplyr::group_by_at)
#' @export
#' @rdname dplyr_verbs
#' @importFrom dplyr group_by_if
chunk_group_by_if.disk.frame <- create_chunk_mapper(dplyr::group_by_if)
#' @export
#' @rdname dplyr_verbs
#' @importFrom dplyr mutate_all
mutate_all.disk.frame <- create_chunk_mapper(dplyr::mutate_all)
#' @export
#' @rdname dplyr_verbs
#' @importFrom dplyr mutate_at
mutate_at.disk.frame <- create_chunk_mapper(dplyr::mutate_at)
#' @export
#' @rdname dplyr_verbs
#' @importFrom dplyr mutate_if
mutate_if.disk.frame <- create_chunk_mapper(dplyr::mutate_if)
#' @export
#' @rdname dplyr_verbs
#' @importFrom dplyr rename_all
rename_all.disk.frame <- create_chunk_mapper(dplyr::rename_all)
#' @export
#' @rdname dplyr_verbs
#' @importFrom dplyr rename_at
rename_at.disk.frame <- create_chunk_mapper(dplyr::rename_at)
#' @export
#' @rdname dplyr_verbs
#' @importFrom dplyr rename_if
rename_if.disk.frame <- create_chunk_mapper(dplyr::rename_if)
#' @export
#' @rdname dplyr_verbs
#' @importFrom dplyr select_all
select_all.disk.frame <- create_chunk_mapper(dplyr::select_all)
#' @export
#' @rdname dplyr_verbs
#' @importFrom dplyr select_at
select_at.disk.frame <- create_chunk_mapper(dplyr::select_at)
#' @export
#' @rdname dplyr_verbs
#' @importFrom dplyr select_if
select_if.disk.frame <- create_chunk_mapper(dplyr::select_if)
#' @export
#' @rdname dplyr_verbs
#' @importFrom dplyr summarise_all
chunk_summarise_all <- create_chunk_mapper(dplyr::summarise_all)
#' @export
#' @rdname dplyr_verbs
#' @importFrom dplyr summarise_at
chunk_summarise_at <- create_chunk_mapper(dplyr::summarise_at)
#' @export
#' @rdname dplyr_verbs
#' @importFrom dplyr summarize_all
chunk_summarize_all <- create_chunk_mapper(dplyr::summarize_all)
#' @export
#' @rdname dplyr_verbs
#' @importFrom dplyr summarize_at
chunk_summarize_at <- create_chunk_mapper(dplyr::summarize_at)
#' @export
#' @rdname dplyr_verbs
#' @importFrom dplyr summarize_if
chunk_summarize_if <- create_chunk_mapper(dplyr::summarize_if)
#' @export
#' @rdname dplyr_verbs
#' @importFrom dplyr distinct
distinct.disk.frame <- function(...) {
stop("`distinct.disk.frame` is not available. Please use `chunk_distinct`")
}
#' @export
#' @rdname dplyr_verbs
#' @importFrom dplyr distinct
chunk_distinct <- create_chunk_mapper(dplyr::distinct, warning_msg = "the `distinct` function applies distinct chunk-wise")
#' The shard keys of the disk.frame
#' @return character
#' @export
#' @param x a disk.frame
groups.disk.frame <- function(x){
shardkey(x)
}
#' Group by within each disk.frame
#' @description
#' The disk.frame group by operation perform group WITHIN each chunk. This is
#' often used for performance reasons. If the user wishes to perform group-by,
#' they may choose to use the `hard_group_by` function which is expensive as it
#' reorganizes the chunks by the shard key.
#' @seealso hard_group_by group_by
#' @param .data a disk.frame
#' @param ... passed to dplyr::group_by
#' @export
#' @rdname chunk_group_by
#' @export
chunk_group_by <- create_chunk_mapper(dplyr::group_by)
#' @rdname chunk_group_by
#' @export
chunk_ungroup = create_chunk_mapper(dplyr::ungroup)
# do not introduce it as it was never introduced
#ungroup.disk.frame( < - create_dplyr_mapper(dplyr::ungroup, , warning_msg="`ungroup.disk.frame` is now deprecated. Please use `chunk_ungroup` instead. This is in preparation for a more powerful `group_by` framework")
#' @export
#' @rdname dplyr_verbs
glimpse.disk.frame <- function(.data, ...) {
glimpse(head(.data, ...), ...)
}
# Internal methods
# @param .data the data
# @param cmd the function to record
record <- function(.data, cmd){
attr(.data,"lazyfn") <- c(attr(.data,"lazyfn"), list(cmd))
.data
}
# Internal methods
# @param .data the disk.frame
# @param cmds the list of function to play back
play <- function(.data, cmds=NULL) {
for (cmd in cmds){
if (typeof(cmd) == "closure") {
.data <- cmd(.data)
} else {
# create a temporary environment
an_env = new.env(parent = environment())
ng = names(cmd$vars_and_pkgs$globals)
if(length(ng) > 0) {
for(i in 1:length(cmd$vars_and_pkgs$globals)) {
g = cmd$vars_and_pkgs$globals[[i]]
assign(ng[i], g, pos = an_env)
}
}
.data <- do.call(cmd$func, c(list(.data),cmd$dotdotdot), envir = an_env)
}
}
.data
}