r-dbi / dbi3

DBI revisited
https://r-dbi.github.io/dbi3
37 stars 2 forks source link

Specify n argument for dbReadTable() #25

Open krlmlr opened 6 years ago

krlmlr commented 6 years ago

to limit the number of rows read.

krlmlr commented 5 years ago

The argument can't be named n because there's a conflict with name:

f <- function(name, ..., n = NULL) {
  tibble::lst(name, ..., n)
}

f("a")
#> $name
#> [1] "a"
#> 
#> $n
#> NULL
f(n = "a")
#> Error in eval_tidy(xs[[i]], unique_output): argument "name" is missing, with no default
f(name = "a")
#> $name
#> [1] "a"
#> 
#> $n
#> NULL

Created on 2019-08-23 by the reprex package (v0.3.0)

Going for max_rows and establishing consistency in r-dbi/DBI#235.

krlmlr commented 4 years ago

Scratch that: n seems perfectly fine. Still need to understand why the first implementation attempt in RSQLite failed.

f <- function(name, ..., n = NULL) {
  tibble::lst(name, ..., n)
}

f("b")
#> $name
#> [1] "b"
#> 
#> $n
#> NULL
f(n = "a")
#> Error in eval_tidy(xs[[i]], unique_output): argument "name" is missing, with no default
f("b", n = "a")
#> $name
#> [1] "b"
#> 
#> $n
#> [1] "a"
f(n = "a", "b")
#> $name
#> [1] "b"
#> 
#> $n
#> [1] "a"

Created on 2019-09-23 by the reprex package (v0.3.0)

krlmlr commented 4 years ago

The problem is partial matching of arguments for backends that don't implement the n argument yet:

library(tibble)

f <- function(name, ...) {
  lst(name, ...)
}

f(3, 1)
#> $name
#> [1] 3
#> 
#> $`1`
#> [1] 1
f(1, name = 3)
#> $name
#> [1] 3
#> 
#> $`1`
#> [1] 1

# Bad
f(1, n = 3)
#> $name
#> [1] 3
#> 
#> $`1`
#> [1] 1

Created on 2019-09-23 by the reprex package (v0.3.0)

krlmlr commented 4 years ago

Can solve by declaring the n argument before the ellipsis in the dbReadTable() generic.

krlmlr commented 4 years ago

Backends probably want to override this to include LIMIT n or TOP n in the query.

krlmlr commented 4 years ago

Postponing, because if we limit rows we also might want to limit columns. This functionality already exists in much better form in dbplyr and other packages.

krlmlr commented 3 years ago

The "first n rows" isn't usually a good criterion because the data is returned in an order decided by the server.