Skip to content

Commit

Permalink
[data_table] Do not break on zero row data frame input (#677)
Browse files Browse the repository at this point in the history
  • Loading branch information
JanMarvin committed Jul 6, 2023
1 parent b5072be commit 01d9ef0
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 7 deletions.
6 changes: 6 additions & 0 deletions R/write.R
Original file line number Diff line number Diff line change
Expand Up @@ -735,6 +735,12 @@ write_data_table <- function(
startRow <- min(dims[[2]])
}

if (data_table && nrow(x) < 1) {
warning("Found data table with zero rows, adding one.",
" Modify na with na.strings")
x[1, ] <- NA
}

## common part ---------------------------------------------------------------
if ((!is.character(sep)) || (length(sep) != 1))
stop("sep must be a character vector of length 1")
Expand Down
19 changes: 12 additions & 7 deletions tests/testthat/test-tables.R
Original file line number Diff line number Diff line change
Expand Up @@ -19,15 +19,12 @@ test_that("write_datatable over tables", {
wb$add_data_table(sheet = 1, x = df1, startCol = 8, startRow = 11)
wb$add_data_table(sheet = 1, x = head(iris, 2), startCol = 4, startRow = 1)



## Now error
expect_error(wb$add_data_table(sheet = 1, x = df1, startCol = "H", startRow = 21), regexp = overwrite_table_error)
expect_error(wb$add_data_table(sheet = 1, x = df1, startCol = 3, startRow = 12), regexp = overwrite_table_error)
expect_error(wb$add_data_table(sheet = 1, x = df1, startCol = 9, startRow = 12), regexp = overwrite_table_error)
expect_error(wb$add_data_table(sheet = 1, x = df1, startCol = "i", startRow = 12), regexp = overwrite_table_error)


## more errors
expect_error(wb$add_data_table(sheet = 1, x = head(iris)), regexp = overwrite_table_error)
expect_error(wb$add_data_table(sheet = 1, x = head(iris), startCol = 4, startRow = 21), regexp = overwrite_table_error)
Expand All @@ -36,7 +33,6 @@ test_that("write_datatable over tables", {
wb$add_data_table(sheet = 1, x = head(iris), startCol = 4, startRow = 22)
wb$add_data_table(sheet = 1, x = head(iris), startCol = 4, startRow = 40)


## more errors
expect_error(wb$add_data_table(sheet = 1, x = head(iris, 2), startCol = 4, startRow = 38), regexp = overwrite_table_error)
expect_error(wb$add_data_table(sheet = 1, x = head(iris, 2), startCol = 4, startRow = 38, colNames = FALSE), regexp = overwrite_table_error)
Expand All @@ -49,9 +45,21 @@ test_that("write_datatable over tables", {
expect_error(wb$add_data_table(sheet = 1, x = head(iris, 2), startCol = 1, startRow = 46, colNames = FALSE), regexp = overwrite_table_error)
})

test_that("zero row data table works", {

wb <- wb_workbook() %>%
wb_add_worksheet()

expect_warning(
wb$add_data_table(x = data.frame(a = NA, b = NA)[0, ]),
"Found data table with zero rows, adding one. Modify na with na.strings"
)

exp <- "A1:B2"
got <- wb$tables$tab_ref
expect_equal(exp, got)

})

test_that("write_data over tables", {
overwrite_table_error <- "Cannot overwrite table headers. Avoid writing over the header row"
Expand All @@ -72,16 +80,13 @@ test_that("write_data over tables", {
wb$add_data(sheet = 1, x = head(iris), startRow = i, startCol = "i")
}



## Now errors on headers
expect_error(wb$add_data(sheet = 1, x = head(iris), startCol = 4, startRow = 4), regexp = overwrite_table_error)
wb$add_data(sheet = 1, x = head(iris), startCol = 4, startRow = 5)
wb$add_data(sheet = 1, x = head(iris)[1:3])
wb$add_data(sheet = 1, x = head(iris, 2), startCol = 4)
wb$add_data(sheet = 1, x = head(iris, 2), startCol = 4, colNames = FALSE)


## Example of how this should be used
wb$add_data_table(sheet = 1, x = head(iris), startCol = 4, startRow = 30)
wb$add_data(sheet = 1, x = head(iris), startCol = 4, startRow = 31, colNames = FALSE)
Expand Down

0 comments on commit 01d9ef0

Please sign in to comment.