43 lines
1.0 KiB
R
43 lines
1.0 KiB
R
library(foreach)
|
|
library(RSQLite)
|
|
|
|
# Define a simple iterator for a query result, which is
|
|
# just a wrapper around the fetch function
|
|
iquery <- function(con, statement, ..., n=1) {
|
|
rs <- dbSendQuery(con, statement, ...)
|
|
nextEl <- function() {
|
|
r <- fetch(rs, n)
|
|
if (nrow(r) == 0) {
|
|
dbClearResult(rs)
|
|
stop('StopIteration')
|
|
}
|
|
r
|
|
}
|
|
obj <- list(nextElem=nextEl)
|
|
class(obj) <- c('abstractiter', 'iter')
|
|
obj
|
|
}
|
|
|
|
# create a SQLite instance and create one connection.
|
|
m <- dbDriver('SQLite')
|
|
|
|
# initialize a new database to a tempfile and copy some data.frame
|
|
# from the base package into it
|
|
tfile <- tempfile()
|
|
con <- dbConnect(m, dbname=tfile)
|
|
data(USArrests)
|
|
dbWriteTable(con, 'USArrests', USArrests)
|
|
|
|
# issue the query, and then iterate over the results
|
|
it <- iquery(con, 'select * from USArrests', n=10)
|
|
r <- foreach(r=it, .combine='rbind') %do% {
|
|
state <- r$row_names
|
|
crime <- r$Murder + r$Assault + r$Rape
|
|
data.frame(state=state, crime=crime)
|
|
}
|
|
print(r)
|
|
|
|
# clean up
|
|
dbDisconnect(con)
|
|
file.remove(tfile)
|