查看环境中可用的S3通用方法

7
抱歉,如果我错过了某些明显的东西...有没有办法提前查看当前环境(例如<environment: R_GlobalEnv>)中存在哪些S3通用方法。列出所有当前基本R中的通用方法就可以了,但我似乎找不到这个列表。
我之所以问这个问题是因为我正在为一个类定义一些方法,其中一些方法已经是通用的S3方法,所以我想提前知道而不必手动检查每个方法。
例如:
isGeneric("mean")
>TRUE

isGeneric("quantile")
>FALSE

目前我最接近的是:

ls(,all.names=TRUE)[sapply(ls(, all.names=TRUE), FUN=isGeneric)]

如果我已经定义了一个方法(但不包括其他可能的通用方法),则这个方法可以工作;如果我将其作为新的R会话中的第一条命令,则会出现以下错误:

  invalid subscript type 'list'
2个回答

12

我怀疑许多通用方法不会出现在全局环境中,它们更有可能出现在一个的环境中。

从help ?Filter中修改示例(该示例列出了基本包环境中的所有函数),我们可以使用isGeneric进行过滤:

Filter(isGeneric,ls(all.names=TRUE, env = baseenv()))
## [1] "-"             "!="            "$"             "$<-"           "%%"            "%/%"           "&"             "*"            
## [9] "/"             "["             "[["            "[[<-"          "[<-"           "^"             "|"             "+"            
## [17] "<"             "<="            "=="            ">"             ">="            "abs"           "acos"          "acosh"        
## [25] "all"           "any"           "anyDuplicated" "as.character"  "as.data.frame" "as.difftime"   "as.double"     "as.numeric"   
## [33] "as.real"       "asin"          "asinh"         "atan"          "atanh"         "body<-"        "c"             "ceiling"      
## [41] "close"         "cos"           "cosh"          "cummax"        "cummin"        "cumprod"       "cumsum"        "digamma"      
## [49] "dim"           "dim<-"         "duplicated"    "exp"           "expm1"         "floor"         "format"        "gamma"        
## [57] "intersect"     "kronecker"     "length"        "lgamma"        "log"           "log10"         "log1p"         "log2"         
## [65] "max"           "min"           "names"         "print"         "prod"          "range"         "rep"           "rev"          
##  [73] "round"         "setdiff"       "sign"          "signif"        "sin"           "sinh"          "sort"          "sqrt"         
##  [81] "sum"           "summary"       "tan"           "tanh"          "trigamma"      "trunc"         "union"         "unique"

如果你需要找到一个函数所在的包,可以使用以下方法:

find('function')

针对您的评论:要搜索搜索路径上所有包中的通用函数,请使用以下命令:

Filter(length,sapply(search(), function(x) {
  Filter(isGeneric,ls(all.names=TRUE,env = as.environment(x)))
    } ))
注意,这是包含在另一个Filter语句中的(用于删除元素长度为0的情况)。
还有base包环境中的内部对象.knownS3Generics也会很有用。

非常感谢。Filter - 见过面了... 我还试图通过给出其他已加载包的环境来扩展逻辑,但是将其馈入 ls() 中遇到了困难... - dardisco
1
使用sapply在search()上,或者是搜索路径子集中的包。 - mnel

2

这里有另一种方法,使用utils::isS3stdGeneric代替methods::isGeneric

我使用以下代码获取base包中的函数:

objs1 <- mget(ls("package:base"), inherits=TRUE)
funs1 <- Filter(is.function, objs)

现在移除那些主体为null的内容(例如sum等基本类型),或者是符号(dontCheck(x), force(x)identity(x)只是简单地返回x)。
genFuns0 <- sapply(
  funs1,
  function(X) {
    if (!is.null(body(X)) & !is.symbol(body(X))) {
      utils::isS3stdGeneric(X)
    }
  },
  simplify=FALSE
)

那么

head(genFuns <- names(Filter(isTRUE, genFuns0)))

提供

[1] "all.equal"     "anyDuplicated" "aperm"         "as.array"     
[5] "as.Date"       "as.expression"

R版本3.6.3(2020年2月29日)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接