很抱歉,如果遗漏了一些明显的东西......有没有办法预先查看当前环境中当前存在哪些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
答案 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))