【发布时间】:2018-05-11 22:21:03
【问题描述】:
我正在尝试在一个大的 .tsv 文件上使用 read_tsv_chunked(),并且想在一定数量的块之后停止。
@jimhester 提出了一种有用的方法,能够使用browse() 交互式查看给定块:https://github.com/tidyverse/readr/issues/848#issuecomment-388234659,但我想编写一个函数,1)只返回感兴趣的块;和 2) 在返回该块后停止读取文件。
我已修改 Jim 的响应以返回块,以便我可以将其与 DataFrameCallback 一起使用,但无法弄清楚如何停止从 read_tsv_chunked() 中读取。
到目前为止我的方法:
get_problem_chunk <- function(num) {
i <- 1
function(x, pos) {
if (i == num) {
i <<- i + 1
return(x)
}
i <<- i + 1
message(pos) # to see that it's scanning the whole file
return(NULL) # break() or error() cause errors
}
}
write_tsv(mtcars, "mtcars.tsv")
read_tsv_chunked("mtcars.tsv", DataFrameCallback$new(get_problem_chunk(3)), chunk_size = 3)
如您所见,它返回了我想要的块,但不会停止读取,直到回调不再获得任何块:
> read_tsv_chunked("mtcars.tsv", DataFrameCallback$new(get_problem_chunk(3)), chunk_size = 3)
Parsed with column specification:
cols(
mpg = col_double(),
cyl = col_integer(),
disp = col_integer(),
hp = col_integer(),
drat = col_double(),
wt = col_double(),
qsec = col_double(),
vs = col_integer(),
am = col_integer(),
gear = col_integer(),
carb = col_integer()
)
1
4
<I WANT IT TO STOP HERE, BUT DON'T KNOW HOW>
10
13
16
19
22
25
28
31
# A tibble: 3 x 11
mpg cyl disp hp drat wt qsec vs am gear carb
<dbl> <int> <int> <int> <dbl> <dbl> <dbl> <int> <int> <int> <int>
1 14.3 8 360 245 3.21 3.57 15.8 0 0 3 4
2 24.4 4 NA 62 3.69 3.19 20 1 0 4 2
3 22.8 4 NA 95 3.92 3.15 22.9 1 0 4 2
【问题讨论】: