21

我想要一个调用,它返回一个向量,其中包含我可以在当前 R 会话中调用的所有函数的名称。有谁知道如何实现这一目标?

(我想根据这个向量检查用户输入的变量。我们在用户输入时遇到了一些不可预见的问题,例如,c作为变量名)

更新:我想从当前加载的所有包中获取函数名称。

解决方案(中途):根据 Joris Meys 的提示,lsf.str()我提出了以下函数,该函数返回具有所有当前可用函数名称的排序向量:

getFunctionNames <- function() {
    loaded <- (.packages())
    loaded <- paste("package:", loaded, sep ="")
    return(sort(unlist(lapply(loaded, lsf.str))))
}

但是,请参阅对 Joris Meys 帖子的评论以获得更好的答案。

4

2 回答 2

21

我会用lsf.str()它作为开始。

例如:x <- as.character(lsf.str("package:base"))为您提供基本包中所有功能的列表。您可以添加所有要检查的包。statsutils首先想到。

编辑:关于您关于当前加载的包的问题:

x <- unlist(sapply(search()[-1],function(x)as.character(lsf.str(x)))) 见评论

pkgs <- search()
pkgs <- pkgs[grep("package:",pkgs)]
y <- unlist(sapply(pkgs,lsf.str))

成功了。

于 2010-11-24T14:24:11.427 回答
7

很多个月前(2007 年)我在 R-Help 上问了一个类似的问题,Brian Ripley 教授提供了这个作为解决方案:

findfuns <- function(x) {
     if(require(x, character.only=TRUE)) {
        env <- paste("package", x, sep=":")
        nm <- ls(env, all=TRUE)
        nm[unlist(lapply(nm, function(n) exists(n, where=env,
                                               mode="function",
                                               inherits=FALSE)))]
     } else character(0)
}
pkgs <- dir(.Library)
z <-  lapply(pkgs, findfuns)
names(z) <- pkgs
Z <- sort(unique(unlist(z)))

这给出了如下输出:

> head(Z)
[1] "^"        "-"        "-.Date"   "-.POSIXt" ":"        "::"

这是为了查找对象指定的包中的所有功能,pkgs以便您可以控制加载/检查哪些包。

适用于当前加载的包集的修改版本将是:

findfuns2 <- function(pkgs) {
    nm <- ls(pkgs, all = TRUE)
    nm[unlist(lapply(nm, function(n) exists(n, where = pkgs,
                                            mode = "function",
                                            inherits = FALSE)))]
    if(isTRUE(all.equal(length(nm), 0)))
        character(0)
    else
        nm
}

pkgs <- search()
pkgs <- pkgs[grep("package:", pkgs)]
z <- lapply(pkgs, findfuns2)
z <- sort(unique(unlist(z)))
head(z)
于 2010-11-24T14:28:12.123 回答