メモ:dplyrの中で使われるDBIのメソッドをリストアップする

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とかはなんか違う気がするけど。まあいっか...。