From 069e8dce3ec8d2b03a4fbe33654ff431541cf52a Mon Sep 17 00:00:00 2001 From: Nic Crane Date: Thu, 16 Dec 2021 08:39:09 +0000 Subject: [PATCH 01/13] Write binding for cpp --- r/R/arrowExports.R | 4 ++++ r/src/csv.cpp | 8 ++++++++ 2 files changed, 12 insertions(+) diff --git a/r/R/arrowExports.R b/r/R/arrowExports.R index 939d9296f5b..f828c9f1682 100644 --- a/r/R/arrowExports.R +++ b/r/R/arrowExports.R @@ -512,6 +512,10 @@ csv___WriteCSV__RecordBatch <- function(record_batch, write_options, stream) { invisible(.Call(`_arrow_csv___WriteCSV__RecordBatch`, record_batch, write_options, stream)) } +csv___WriteCSV__RecordBatchReader <- function(reader, write_options, stream) { + invisible(.Call(`_arrow_csv___WriteCSV__RecordBatchReader`, reader, write_options, stream)) +} + dataset___Dataset__NewScan <- function(ds) { .Call(`_arrow_dataset___Dataset__NewScan`, ds) } diff --git a/r/src/csv.cpp b/r/src/csv.cpp index 93d07d82ed4..bb901e798d7 100644 --- a/r/src/csv.cpp +++ b/r/src/csv.cpp @@ -202,4 +202,12 @@ void csv___WriteCSV__RecordBatch( StopIfNotOk(arrow::csv::WriteCSV(*record_batch, *write_options, stream.get())); } +// [[arrow::export]] +void csv___WriteCSV__RecordBatchReader( + const std::shared_ptr& reader, + const std::shared_ptr& write_options, + const std::shared_ptr& stream) { + StopIfNotOk(arrow::csv::WriteCSV(reader, *write_options, stream.get())); +} + #endif From 43f08f3242c3adecbf16dd14cbbb34407dfee0d9 Mon Sep 17 00:00:00 2001 From: Nic Crane Date: Thu, 16 Dec 2021 08:40:16 +0000 Subject: [PATCH 02/13] Enable writeCSV from RecordBatchReader --- r/R/csv.R | 4 +++- r/src/arrowExports.cpp | 19 +++++++++++++++++++ r/tests/testthat/test-csv.R | 16 ++++++++++++++++ 3 files changed, 38 insertions(+), 1 deletion(-) diff --git a/r/R/csv.R b/r/R/csv.R index 1842394f6b9..2dd07407c21 100644 --- a/r/R/csv.R +++ b/r/R/csv.R @@ -707,7 +707,7 @@ write_csv_arrow <- function(x, x <- Table$create(x) } - assert_that(is_writable_table(x)) + assert_that(is_writable_table(x) | inherits(x, "FileSystemDataset")) if (!inherits(sink, "OutputStream")) { sink <- make_output_stream(sink) @@ -718,6 +718,8 @@ write_csv_arrow <- function(x, csv___WriteCSV__RecordBatch(x, write_options, sink) } else if (inherits(x, "Table")) { csv___WriteCSV__Table(x, write_options, sink) + } else if (inherits(x, "FileSystemDataset")) { + csv___WriteCSV__RecordBatchReader(x, write_options, sink) } invisible(x_out) diff --git a/r/src/arrowExports.cpp b/r/src/arrowExports.cpp index 8ab6aa5a9da..b7a7bc58e65 100644 --- a/r/src/arrowExports.cpp +++ b/r/src/arrowExports.cpp @@ -2012,6 +2012,24 @@ extern "C" SEXP _arrow_csv___WriteCSV__RecordBatch(SEXP record_batch_sexp, SEXP } #endif +// csv.cpp +#if defined(ARROW_R_WITH_ARROW) +void csv___WriteCSV__RecordBatchReader(const std::shared_ptr& reader, const std::shared_ptr& write_options, const std::shared_ptr& stream); +extern "C" SEXP _arrow_csv___WriteCSV__RecordBatchReader(SEXP reader_sexp, SEXP write_options_sexp, SEXP stream_sexp){ +BEGIN_CPP11 + arrow::r::Input&>::type reader(reader_sexp); + arrow::r::Input&>::type write_options(write_options_sexp); + arrow::r::Input&>::type stream(stream_sexp); + csv___WriteCSV__RecordBatchReader(reader, write_options, stream); + return R_NilValue; +END_CPP11 +} +#else +extern "C" SEXP _arrow_csv___WriteCSV__RecordBatchReader(SEXP reader_sexp, SEXP write_options_sexp, SEXP stream_sexp){ + Rf_error("Cannot call csv___WriteCSV__RecordBatchReader(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. "); +} +#endif + // dataset.cpp #if defined(ARROW_R_WITH_DATASET) std::shared_ptr dataset___Dataset__NewScan(const std::shared_ptr& ds); @@ -7709,6 +7727,7 @@ static const R_CallMethodDef CallEntries[] = { { "_arrow_TimestampParser__MakeISO8601", (DL_FUNC) &_arrow_TimestampParser__MakeISO8601, 0}, { "_arrow_csv___WriteCSV__Table", (DL_FUNC) &_arrow_csv___WriteCSV__Table, 3}, { "_arrow_csv___WriteCSV__RecordBatch", (DL_FUNC) &_arrow_csv___WriteCSV__RecordBatch, 3}, + { "_arrow_csv___WriteCSV__RecordBatchReader", (DL_FUNC) &_arrow_csv___WriteCSV__RecordBatchReader, 3}, { "_arrow_dataset___Dataset__NewScan", (DL_FUNC) &_arrow_dataset___Dataset__NewScan, 1}, { "_arrow_dataset___Dataset__schema", (DL_FUNC) &_arrow_dataset___Dataset__schema, 1}, { "_arrow_dataset___Dataset__type_name", (DL_FUNC) &_arrow_dataset___Dataset__type_name, 1}, diff --git a/r/tests/testthat/test-csv.R b/r/tests/testthat/test-csv.R index bc9354342c3..bf91b5bd3e3 100644 --- a/r/tests/testthat/test-csv.R +++ b/r/tests/testthat/test-csv.R @@ -503,3 +503,19 @@ test_that("read_csv_arrow() deals with BOMs (byte-order-marks) correctly", { tibble(a = 1, b = 2) ) }) + +test_that("write_csv_arrow can write from FileSystemDataset objects", { + + skip_if_not_available("dataset") + data_dir <- make_temp_dir() + write_dataset(tbl_no_dates, data_dir, partitioning = "lgl") + data_in <- open_dataset(data_dir) + + csv_file <- tempfile() + tbl_out <- write_csv_arrow(data_in, csv_file) + + + expect_true(file.exists(csv_file)) + expect_identical(tbl_out, tbl_no_dates) + +}) From 01e1ae59de2debefb1076b119f7bd463946a7df0 Mon Sep 17 00:00:00 2001 From: Nic Crane Date: Tue, 1 Feb 2022 17:22:36 +0000 Subject: [PATCH 03/13] Update code to produce an RBReader and update tests accordingly --- r/R/csv.R | 3 ++- r/tests/testthat/test-csv.R | 7 ++++--- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/r/R/csv.R b/r/R/csv.R index 2dd07407c21..6e1e6e61479 100644 --- a/r/R/csv.R +++ b/r/R/csv.R @@ -719,7 +719,8 @@ write_csv_arrow <- function(x, } else if (inherits(x, "Table")) { csv___WriteCSV__Table(x, write_options, sink) } else if (inherits(x, "FileSystemDataset")) { - csv___WriteCSV__RecordBatchReader(x, write_options, sink) + rb_reader <- Scanner$create(x)$ToRecordBatchReader() + csv___WriteCSV__RecordBatchReader(rb_reader, write_options, sink) } invisible(x_out) diff --git a/r/tests/testthat/test-csv.R b/r/tests/testthat/test-csv.R index bf91b5bd3e3..c1ed4c53a89 100644 --- a/r/tests/testthat/test-csv.R +++ b/r/tests/testthat/test-csv.R @@ -513,9 +513,10 @@ test_that("write_csv_arrow can write from FileSystemDataset objects", { csv_file <- tempfile() tbl_out <- write_csv_arrow(data_in, csv_file) - - expect_true(file.exists(csv_file)) - expect_identical(tbl_out, tbl_no_dates) + + tbl_in <- read_csv_arrow(csv_file) + expect_named(tbl_in, c("dbl", "false", "chr", "lgl")) + expect_equal(nrow(tbl_in), 10) }) From 0b67b7bb478ba67efd4640f8c5fc2a61579698e6 Mon Sep 17 00:00:00 2001 From: Nic Crane Date: Tue, 1 Feb 2022 18:17:51 +0000 Subject: [PATCH 04/13] Fix "or" --- r/R/csv.R | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/r/R/csv.R b/r/R/csv.R index 6e1e6e61479..cfc0bb4e3d4 100644 --- a/r/R/csv.R +++ b/r/R/csv.R @@ -707,7 +707,7 @@ write_csv_arrow <- function(x, x <- Table$create(x) } - assert_that(is_writable_table(x) | inherits(x, "FileSystemDataset")) + assert_that(is_writable_table(x) || inherits(x, "FileSystemDataset")) if (!inherits(sink, "OutputStream")) { sink <- make_output_stream(sink) From 3ce0757c40657cad4fe96622faa1339e4cdac375 Mon Sep 17 00:00:00 2001 From: Nic Crane Date: Thu, 3 Feb 2022 15:35:24 +0000 Subject: [PATCH 05/13] Enable it to work for both Dataset and arrow_dplyr_query objects --- r/R/csv.R | 12 +++++++++--- r/tests/testthat/test-csv.R | 38 ++++++++++++++++++++++++++++--------- 2 files changed, 38 insertions(+), 12 deletions(-) diff --git a/r/R/csv.R b/r/R/csv.R index cfc0bb4e3d4..6eb5ae4afff 100644 --- a/r/R/csv.R +++ b/r/R/csv.R @@ -699,15 +699,21 @@ write_csv_arrow <- function(x, if (is.null(write_options)) { write_options <- readr_to_csv_write_options( include_header = include_header, - batch_size = batch_size) + batch_size = batch_size + ) } x_out <- x + + if (inherits(x, "arrow_dplyr_query")) { + x <- as.data.frame(x) + } + if (is.data.frame(x)) { x <- Table$create(x) } - assert_that(is_writable_table(x) || inherits(x, "FileSystemDataset")) + assert_that(is_writable_table(x) || inherits(x, "Dataset")) if (!inherits(sink, "OutputStream")) { sink <- make_output_stream(sink) @@ -718,7 +724,7 @@ write_csv_arrow <- function(x, csv___WriteCSV__RecordBatch(x, write_options, sink) } else if (inherits(x, "Table")) { csv___WriteCSV__Table(x, write_options, sink) - } else if (inherits(x, "FileSystemDataset")) { + } else if (inherits(x, "Dataset")) { rb_reader <- Scanner$create(x)$ToRecordBatchReader() csv___WriteCSV__RecordBatchReader(rb_reader, write_options, sink) } diff --git a/r/tests/testthat/test-csv.R b/r/tests/testthat/test-csv.R index c1ed4c53a89..0614c7a27a0 100644 --- a/r/tests/testthat/test-csv.R +++ b/r/tests/testthat/test-csv.R @@ -461,9 +461,12 @@ test_that("Writing a CSV errors when unsupported (yet) readr args are used", { append = FALSE, quote = "all", escape = "double", - eol = "\n", ), - paste("The following arguments are not yet supported in Arrow: \"append\",", - "\"quote\", \"escape\", and \"eol\"") + eol = "\n", + ), + paste( + "The following arguments are not yet supported in Arrow: \"append\",", + "\"quote\", \"escape\", and \"eol\"" + ) ) }) @@ -471,8 +474,10 @@ test_that("write_csv_arrow deals with duplication in sink/file", { # errors when both file and sink are supplied expect_error( write_csv_arrow(tbl, file = csv_file, sink = csv_file), - paste("You have supplied both \"file\" and \"sink\" arguments. Please", - "supply only one of them") + paste( + "You have supplied both \"file\" and \"sink\" arguments. Please", + "supply only one of them" + ) ) }) @@ -484,8 +489,10 @@ test_that("write_csv_arrow deals with duplication in include_headers/col_names", include_header = TRUE, col_names = TRUE ), - paste("You have supplied both \"col_names\" and \"include_header\"", - "arguments. Please supply only one of them") + paste( + "You have supplied both \"col_names\" and \"include_header\"", + "arguments. Please supply only one of them" + ) ) written_tbl <- suppressMessages( @@ -504,8 +511,7 @@ test_that("read_csv_arrow() deals with BOMs (byte-order-marks) correctly", { ) }) -test_that("write_csv_arrow can write from FileSystemDataset objects", { - +test_that("write_csv_arrow can write from Dataset objects", { skip_if_not_available("dataset") data_dir <- make_temp_dir() write_dataset(tbl_no_dates, data_dir, partitioning = "lgl") @@ -518,5 +524,19 @@ test_that("write_csv_arrow can write from FileSystemDataset objects", { tbl_in <- read_csv_arrow(csv_file) expect_named(tbl_in, c("dbl", "false", "chr", "lgl")) expect_equal(nrow(tbl_in), 10) +}) +test_that("write_csv_arrow can write from arrow_dplyr_query objects", { + library(dplyr, warn.conflicts = FALSE) + + query_obj <- arrow_table(tbl_no_dates) %>% + filter(lgl == TRUE) + + csv_file <- tempfile() + tbl_out <- write_csv_arrow(query_obj, csv_file) + expect_true(file.exists(csv_file)) + + tbl_in <- read_csv_arrow(csv_file) + expect_named(tbl_in, c("dbl", "lgl", "false", "chr")) + expect_equal(nrow(tbl_in), 3) }) From df1c9ee31a894ceb19264a50c24ffa9beb476c98 Mon Sep 17 00:00:00 2001 From: Nic Crane Date: Thu, 3 Feb 2022 16:29:49 +0000 Subject: [PATCH 06/13] skip if no datasets --- r/tests/testthat/test-csv.R | 1 + 1 file changed, 1 insertion(+) diff --git a/r/tests/testthat/test-csv.R b/r/tests/testthat/test-csv.R index 0614c7a27a0..89f7c6d89f4 100644 --- a/r/tests/testthat/test-csv.R +++ b/r/tests/testthat/test-csv.R @@ -527,6 +527,7 @@ test_that("write_csv_arrow can write from Dataset objects", { }) test_that("write_csv_arrow can write from arrow_dplyr_query objects", { + skip_if_not_available("dataset") library(dplyr, warn.conflicts = FALSE) query_obj <- arrow_table(tbl_no_dates) %>% From b26676cad3deb55d34277e827978fe4fae8fd14e Mon Sep 17 00:00:00 2001 From: Nic Crane Date: Wed, 9 Feb 2022 13:55:10 +0000 Subject: [PATCH 07/13] Review changes --- r/R/csv.R | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/r/R/csv.R b/r/R/csv.R index 6eb5ae4afff..5e7aa60c224 100644 --- a/r/R/csv.R +++ b/r/R/csv.R @@ -713,7 +713,7 @@ write_csv_arrow <- function(x, x <- Table$create(x) } - assert_that(is_writable_table(x) || inherits(x, "Dataset")) + assert_that(is_writable_table(x) || inherits(x, c("Dataset", "arrow_dplyr_query"))) if (!inherits(sink, "OutputStream")) { sink <- make_output_stream(sink) @@ -724,7 +724,7 @@ write_csv_arrow <- function(x, csv___WriteCSV__RecordBatch(x, write_options, sink) } else if (inherits(x, "Table")) { csv___WriteCSV__Table(x, write_options, sink) - } else if (inherits(x, "Dataset")) { + } else if (inherits(x, c("Dataset", "arrow_dplyr_query"))) { rb_reader <- Scanner$create(x)$ToRecordBatchReader() csv___WriteCSV__RecordBatchReader(rb_reader, write_options, sink) } From 5e8b16f90db83aa781a9d8b6602094afa82cdc70 Mon Sep 17 00:00:00 2001 From: Nic Crane Date: Wed, 9 Feb 2022 13:57:00 +0000 Subject: [PATCH 08/13] extra comma --- r/tests/testthat/test-csv.R | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/r/tests/testthat/test-csv.R b/r/tests/testthat/test-csv.R index 89f7c6d89f4..1a27aed5040 100644 --- a/r/tests/testthat/test-csv.R +++ b/r/tests/testthat/test-csv.R @@ -461,7 +461,7 @@ test_that("Writing a CSV errors when unsupported (yet) readr args are used", { append = FALSE, quote = "all", escape = "double", - eol = "\n", + eol = "\n" ), paste( "The following arguments are not yet supported in Arrow: \"append\",", From b87df7473ba01798ec1f9bd9d45f368d04fea8b8 Mon Sep 17 00:00:00 2001 From: Nic Crane Date: Fri, 11 Feb 2022 15:38:05 +0000 Subject: [PATCH 09/13] Update r/R/csv.R Co-authored-by: Neal Richardson --- r/R/csv.R | 5 ----- 1 file changed, 5 deletions(-) diff --git a/r/R/csv.R b/r/R/csv.R index 5e7aa60c224..40dc70c6d7f 100644 --- a/r/R/csv.R +++ b/r/R/csv.R @@ -704,11 +704,6 @@ write_csv_arrow <- function(x, } x_out <- x - - if (inherits(x, "arrow_dplyr_query")) { - x <- as.data.frame(x) - } - if (is.data.frame(x)) { x <- Table$create(x) } From f352d6d99eaf74c6bef2d93029754c36049d9ea1 Mon Sep 17 00:00:00 2001 From: Nic Crane Date: Mon, 21 Feb 2022 09:46:35 +0000 Subject: [PATCH 10/13] Add test for rb reader --- r/R/csv.R | 20 ++++++++++++++++---- r/tests/testthat/test-csv.R | 20 +++++++++++++++++++- 2 files changed, 35 insertions(+), 5 deletions(-) diff --git a/r/R/csv.R b/r/R/csv.R index 40dc70c6d7f..0ffd93a9caa 100644 --- a/r/R/csv.R +++ b/r/R/csv.R @@ -708,7 +708,9 @@ write_csv_arrow <- function(x, x <- Table$create(x) } - assert_that(is_writable_table(x) || inherits(x, c("Dataset", "arrow_dplyr_query"))) + if (inherits(x, c("Dataset", "arrow_dplyr_query"))) { + x <- Scanner$create(x)$ToRecordBatchReader() + } if (!inherits(sink, "OutputStream")) { sink <- make_output_stream(sink) @@ -719,9 +721,19 @@ write_csv_arrow <- function(x, csv___WriteCSV__RecordBatch(x, write_options, sink) } else if (inherits(x, "Table")) { csv___WriteCSV__Table(x, write_options, sink) - } else if (inherits(x, c("Dataset", "arrow_dplyr_query"))) { - rb_reader <- Scanner$create(x)$ToRecordBatchReader() - csv___WriteCSV__RecordBatchReader(rb_reader, write_options, sink) + } else if (inherits(x, c("RecordBatchReader"))) { + csv___WriteCSV__RecordBatchReader(x, write_options, sink) + } else { + abort( + c( + paste0( + paste( + "x must be an object of class 'data.frame', 'RecordBatch',", + "'Dataset', 'Table', or 'RecordBatchReader' not '" + ), class(x)[[1]], "'." + ) + ) + ) } invisible(x_out) diff --git a/r/tests/testthat/test-csv.R b/r/tests/testthat/test-csv.R index 1a27aed5040..f237fed6d50 100644 --- a/r/tests/testthat/test-csv.R +++ b/r/tests/testthat/test-csv.R @@ -389,7 +389,7 @@ test_that("Write a CSV file with invalid input type", { bad_input <- Array$create(1:5) expect_error( write_csv_arrow(bad_input, csv_file), - regexp = "x must be an object of class 'data.frame', 'RecordBatch', or 'Table', not 'Array'." + regexp = "x must be an object of class 'data.frame', 'RecordBatch', 'Dataset', 'Table', or 'RecordBatchReader' not 'Array'." ) }) @@ -541,3 +541,21 @@ test_that("write_csv_arrow can write from arrow_dplyr_query objects", { expect_named(tbl_in, c("dbl", "lgl", "false", "chr")) expect_equal(nrow(tbl_in), 3) }) + +test_that("write_csv_arrow can write from RecordBatchReader objects", { + skip_if_not_available("dataset") + library(dplyr, warn.conflicts = FALSE) + + query_obj <- arrow_table(tbl_no_dates) %>% + filter(lgl == TRUE) + + rb_reader <- Scanner$create(query_obj)$ToRecordBatchReader() + + csv_file <- tempfile() + tbl_out <- write_csv_arrow(rb_reader, csv_file) + expect_true(file.exists(csv_file)) + + tbl_in <- read_csv_arrow(csv_file) + expect_named(tbl_in, c("dbl", "lgl", "false", "chr")) + expect_equal(nrow(tbl_in), 3) +}) From d01a1c8a3943113a3ba8d02b6494ffaadebb986f Mon Sep 17 00:00:00 2001 From: Nicola Crane Date: Wed, 23 Feb 2022 08:02:04 +0000 Subject: [PATCH 11/13] Update r/tests/testthat/test-csv.R Co-authored-by: Neal Richardson --- r/tests/testthat/test-csv.R | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/r/tests/testthat/test-csv.R b/r/tests/testthat/test-csv.R index f237fed6d50..b0e0453577f 100644 --- a/r/tests/testthat/test-csv.R +++ b/r/tests/testthat/test-csv.R @@ -389,7 +389,7 @@ test_that("Write a CSV file with invalid input type", { bad_input <- Array$create(1:5) expect_error( write_csv_arrow(bad_input, csv_file), - regexp = "x must be an object of class 'data.frame', 'RecordBatch', 'Dataset', 'Table', or 'RecordBatchReader' not 'Array'." + regexp = "x must be an object of class .* not 'Array'." ) }) From ce015f2bdf36547c4b7020850e05d791d06f2f64 Mon Sep 17 00:00:00 2001 From: Nicola Crane Date: Wed, 23 Feb 2022 08:02:55 +0000 Subject: [PATCH 12/13] Update r/tests/testthat/test-csv.R Co-authored-by: Neal Richardson --- r/tests/testthat/test-csv.R | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/r/tests/testthat/test-csv.R b/r/tests/testthat/test-csv.R index b0e0453577f..bf6557dd9f0 100644 --- a/r/tests/testthat/test-csv.R +++ b/r/tests/testthat/test-csv.R @@ -549,10 +549,9 @@ test_that("write_csv_arrow can write from RecordBatchReader objects", { query_obj <- arrow_table(tbl_no_dates) %>% filter(lgl == TRUE) - rb_reader <- Scanner$create(query_obj)$ToRecordBatchReader() - csv_file <- tempfile() - tbl_out <- write_csv_arrow(rb_reader, csv_file) + on.exit(unlink(csv_file) + tbl_out <- write_csv_arrow(query_obj, csv_file) expect_true(file.exists(csv_file)) tbl_in <- read_csv_arrow(csv_file) From 2db1a9812a4a1f1862f0c3734dfcc822f7116069 Mon Sep 17 00:00:00 2001 From: Nic Crane Date: Tue, 1 Mar 2022 12:22:54 +0000 Subject: [PATCH 13/13] Remove redundant test --- r/tests/testthat/test-csv.R | 18 +----------------- 1 file changed, 1 insertion(+), 17 deletions(-) diff --git a/r/tests/testthat/test-csv.R b/r/tests/testthat/test-csv.R index bf6557dd9f0..2f3ac7a941e 100644 --- a/r/tests/testthat/test-csv.R +++ b/r/tests/testthat/test-csv.R @@ -526,22 +526,6 @@ test_that("write_csv_arrow can write from Dataset objects", { expect_equal(nrow(tbl_in), 10) }) -test_that("write_csv_arrow can write from arrow_dplyr_query objects", { - skip_if_not_available("dataset") - library(dplyr, warn.conflicts = FALSE) - - query_obj <- arrow_table(tbl_no_dates) %>% - filter(lgl == TRUE) - - csv_file <- tempfile() - tbl_out <- write_csv_arrow(query_obj, csv_file) - expect_true(file.exists(csv_file)) - - tbl_in <- read_csv_arrow(csv_file) - expect_named(tbl_in, c("dbl", "lgl", "false", "chr")) - expect_equal(nrow(tbl_in), 3) -}) - test_that("write_csv_arrow can write from RecordBatchReader objects", { skip_if_not_available("dataset") library(dplyr, warn.conflicts = FALSE) @@ -550,7 +534,7 @@ test_that("write_csv_arrow can write from RecordBatchReader objects", { filter(lgl == TRUE) csv_file <- tempfile() - on.exit(unlink(csv_file) + on.exit(unlink(csv_file)) tbl_out <- write_csv_arrow(query_obj, csv_file) expect_true(file.exists(csv_file))