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

时间:2013-04-04 05:27:05

标签: r generics methods amazon-s3

很抱歉,如果遗漏了一些明显的东西......有没有办法预先查看当前环境中当前存在哪些S3泛型方法(比如<environment: R_GlobalEnv>。基础{{1}中所有当前通用方法的列表会很好,但我似乎找不到一个。

我问的原因是我为R定义了一些methods,其中一些已经是通用的S3方法所以我想事先知道而不必检查每个人手动。

例如:

class

目前我最接近的是:

isGeneric("mean")
>TRUE

isGeneric("quantile")
>FALSE

如果我已经定义了一个方法(但没有提供其他可能的通用方法),那么当我在新的ls(,all.names=TRUE)[sapply(ls(, all.names=TRUE), FUN=isGeneric)] 会话中将其作为第一个命令提供时会出现以下错误:

R

2 个答案:

答案 0 :(得分:9)

我怀疑在全球环境中会找到许多通用方法,它们更有可能位于的环境中。

修改帮助?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语句中(用于删除length==0)的元素。


.knownS3Generics包环境中还有一个内部对象base也很有用。

答案 1 :(得分:0)

@mnel方法不适用于R:

平台x86_64-w64-mingw32
拱形x86_64
os mingw32
系统x86_64,mingw32
状态
专业3
次要5.0
2018年
第04个月
第23天
svn版本74626
语言R
version.string R版本3.5.0(2018-04-23) 昵称“玩耍中的欢乐”

我使用以下方法获取基本泛型函数:

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

genFuns0 <- sapply(
  funs,
  function(X) {
    if (!is.null(body(X)) & !is.symbol(body(X))) {
      utils::isS3stdGeneric(X)
    }
  },
  simplify = F
)

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