如何枚举包实现的所有S4方法?

时间:2016-10-05 15:57:22

标签: r enumeration s4

我正在寻找一种方法来查询特定包实现的所有S4方法(通过其命名空间环境给出)。我想我可以列举所有以.__T__开头的对象,但我更倾向于使用记录和/或不那么强硬的方式。

> ls(asNamespace("RSQLite"), all.names = TRUE, pattern = "^[.]__T__")
 [1] ".__T__dbBegin:DBI"                 ".__T__dbBeginTransaction:RSQLite" 
 [3] ".__T__dbBind:DBI"                  ".__T__dbClearResult:DBI"          
 [5] ".__T__dbColumnInfo:DBI"            ".__T__dbCommit:DBI"               
 [7] ".__T__dbConnect:DBI"               ".__T__dbDataType:DBI"             
 [9] ".__T__dbDisconnect:DBI"            ".__T__dbExistsTable:DBI"          
[11] ".__T__dbFetch:DBI"                 ".__T__dbGetException:DBI"         
[13] ".__T__dbGetInfo:DBI"               ".__T__dbGetPreparedQuery:RSQLite" 
[15] ".__T__dbGetQuery:DBI"              ".__T__dbGetRowCount:DBI"          
[17] ".__T__dbGetRowsAffected:DBI"       ".__T__dbGetStatement:DBI"         
[19] ".__T__dbHasCompleted:DBI"          ".__T__dbIsValid:DBI"              
[21] ".__T__dbListFields:DBI"            ".__T__dbListResults:DBI"          
[23] ".__T__dbListTables:DBI"            ".__T__dbReadTable:DBI"            
[25] ".__T__dbRemoveTable:DBI"           ".__T__dbRollback:DBI"             
[27] ".__T__dbSendPreparedQuery:RSQLite" ".__T__dbSendQuery:DBI"            
[29] ".__T__dbUnloadDriver:DBI"          ".__T__dbWriteTable:DBI"           
[31] ".__T__fetch:DBI"                   ".__T__isSQLKeyword:DBI"           
[33] ".__T__make.db.names:DBI"           ".__T__show:methods"               
[35] ".__T__sqlData:DBI"                 ".__T__SQLKeywords:DBI"            

2 个答案:

答案 0 :(得分:2)

我认为你想要showMethods函数,如:

showMethods(where=asNamespace("RSQLite"))

输出结果为:

Function: dbBegin (package DBI)
conn="SQLiteConnection"

Function: dbBeginTransaction (package RSQLite)
conn="ANY"

Function: dbClearResult (package DBI)
res="SQLiteConnection"
res="SQLiteResult"

Function: dbColumnInfo (package DBI)
res="SQLiteResult"

这会继续进行更多行。 ?showMethods将有一些额外的参数来定制结果。

答案 1 :(得分:2)

我认为showMethods是方法中唯一可用的东西,但它实际上不会将函数作为对象返回,只是将它们打印到屏幕上。

以下内容将返回环境中定义的方法列表。改编自covr::replacements_S4(),用于修改包中的所有方法以跟踪覆盖范围。

S4_methods <- function(env) {
  generics <- methods::getGenerics(env)

  res <- Map(generics@.Data, generics@package, USE.NAMES = FALSE,
    f = function(name, package) {
      what <- methods::methodsPackageMetaName("T", paste(name, package, sep = ":"))

      table <- get(what, envir = env)

      mget(ls(table, all.names = TRUE), envir = table)
    })
  res[lengths(res) > 0]
}

m <- S4_methods(asNamespace("DBI"))
length(m)
#> [1] 21
m[1:3]
#> [[1]]
#> [[1]]$DBIObject
#> function(dbObj, obj, ...) {
#>   dbiDataType(obj)
#> }
#> <environment: namespace:DBI>
#> attr(,"target")
#> An object of class "signature"
#>       dbObj 
#> "DBIObject" 
#> attr(,"defined")
#> An object of class "signature"
#>       dbObj 
#> "DBIObject" 
#> attr(,"generic")
#> [1] "dbDataType"
#> attr(,"generic")attr(,"package")
#> [1] "DBI"
#> attr(,"class")
#> [1] "MethodDefinition"
#> attr(,"class")attr(,"package")
#> [1] "methods"
#> 
#> 
#> [[2]]
#> [[2]]$character
#> function(drvName, ...) {
#>     findDriver(drvName)(...)
#>   }
#> <environment: namespace:DBI>
#> attr(,"target")
#> An object of class "signature"
#>     drvName 
#> "character" 
#> attr(,"defined")
#> An object of class "signature"
#>     drvName 
#> "character" 
#> attr(,"generic")
#> [1] "dbDriver"
#> attr(,"generic")attr(,"package")
#> [1] "DBI"
#> attr(,"class")
#> [1] "MethodDefinition"
#> attr(,"class")attr(,"package")
#> [1] "methods"
#> 
#> 
#> [[3]]
#> [[3]]$`DBIConnection#character`
#> function(conn, statement, ...) {
#>     rs <- dbSendStatement(conn, statement, ...)
#>     on.exit(dbClearResult(rs))
#>     dbGetRowsAffected(rs)
#>   }
#> <environment: namespace:DBI>
#> attr(,"target")
#> An object of class "signature"
#>            conn       statement 
#> "DBIConnection"     "character" 
#> attr(,"defined")
#> An object of class "signature"
#>            conn       statement 
#> "DBIConnection"     "character" 
#> attr(,"generic")
#> [1] "dbExecute"
#> attr(,"generic")attr(,"package")
#> [1] "DBI"
#> attr(,"class")
#> [1] "MethodDefinition"
#> attr(,"class")attr(,"package")
#> [1] "methods"