dplyrのバックエンドとして使えるようにするにはDBIのメソッドを実装しなくてはいけません。とはいっても全部実装しなくてもいいはずで、じゃあどれを実装すればいいのかと言うとAdding a new SQL backendを読めばいいはずなんですが、いまいちピンと来なかったのでむりやり探してみたときのメモ。r-wakalangにも書いたけど(メモ代わりに使ってすみません…)、いちおうこっちにも。
library(dplyr) library(DBI) library(purrr) envir <- asNamespace('dplyr') # 使われている関数名をすべて抜き出す # 参考:http://adv-r.had.co.nz/Expressions.html#ast-funs find_fun <- function(x) { if (is.atomic(x) || is.name(x)) { x_chr <- deparse(x) if(x_chr == "") return(NULL) if(!exists(x_chr, envir = envir, mode = "function")) return(NULL) x_chr } else if (is.call(x) || is.pairlist(x)) { unlist(lapply(x, find_fun)) } else { stop("Don't know how to handle type ", typeof(x), call. = FALSE) } } # dplyrの中で使われているすべての関数 fun_dplyr <- ls(envir, all.names = TRUE) %>% map(get, envir = envir) %>% keep(is.function) %>% map(body) %>% map(find_fun) intersect(unique(unlist(fun_dplyr)), ls('package:DBI')) #> [1] "fetch" "dbGetQuery" "dbBegin" "dbCommit" "dbDataType" "dbDisconnect" "dbExistsTable" #> [8] "dbWriteTable" "dbListTables" "dbSendQuery" "dbClearResult" "dbListFields" "dbGetInfo" "dbRollback" #> [15] "dbRemoveTable" "dbHasCompleted" "dbGetRowCount" "dbConnect"
fetch
とかはなんか違う気がするけど。まあいっか...。