隐藏ls()结果中的函数名称 - 更快地查找变量名称

时间:2012-10-26 20:58:53

标签: r ls

当我们定义了数十个函数 - 可能是开发一个新包时 - 很难通过ls()命令找出许多函数名中特定变量的名称。

在大多数情况下,我们不会寻找函数名称 - 我们已经知道它们存在 - 但我们想要找到我们为变量赋予的名称。

非常感谢任何解决它的想法。

6 个答案:

答案 0 :(得分:5)

如果你想要一个函数来做这件事,你需要在ls()查看的环境中玩一下。在正常使用中,下面的实现将通过在函数的父框架中列出对象来工作。 ,如果在顶层调用,将成为全球环境。

lsnofun <- function(name = parent.frame()) {
    obj <- ls(name = name)
    obj[!sapply(obj, function(x) is.function(get(x)))]
}

> ls()
[1] "bar"           "crossvalidate" "df"           
[4] "f1"            "f2"            "foo"          
[7] "lsnofun"       "prod"         
> lsnofun()
[1] "crossvalidate" "df"            "f1"           
[4] "f2"            "foo"           "prod"

我已经写了这个,所以如果你需要在一系列嵌套函数调用中调用这个方法,你可以传入name ls()参数。

另外,当我们测试它们是否为函数时,我们还需要get() ls()指定的对象。

答案 1 :(得分:4)

所以也许

ls()[!ls()%in%lsf.str()]

Josh O'Brien的建议是使用

setdiff(ls(), lsf.str())

该功能在经过一些转换和检查后调用

x[match(x, y, 0L) == 0L]

这与我在第一时间建议的非常接近,但在函数setdiff中很好地包装。

答案 2 :(得分:4)

不是在全局环境中对对象进行排序并尝试从函数中分离数据对象,最好将函数存储在不同的环境中,以便ls()不列出它们(默认情况下它只列出全球环境中的事物)。但它们仍然可以访问,如果需要可以列出。

执行此操作的最佳方法是创建包含其中功能的包。这并不像有时看起来那么难,只需使用package.skeleton开始。

另一种方法是使用save函数将所有函数保存到文件中,从全局环境中删除它们,然后使用attach函数附加此文件(以及所有函数) )到搜索路径。

答案 3 :(得分:1)

所以你只想要变量名,而不是函数?这样就可以了。

ls()[!sapply(ls(), function(x) is.function(get(x)))]

答案 4 :(得分:1)

以前的函数lsos之前发布在stackoverflow(link)上 - 它根据R会话的大小给出了R会话中加载的对象的良好排序。函数的输出包含对象的类,您可以随后对其进行过滤以获取非函数对象。

source("lsos.R")

A <- 1
B <- 1
C <- 1
D <- 1
E <- 1
F <- function(x) print(x)

L <- lsos(n=Inf)
L[L$Type != "function",]

返回:

> lsos(n=Inf)
         Type Size Rows Columns
lsos function 5184   NA      NA
F    function 1280   NA      NA
A     numeric   48    1      NA
B     numeric   48    1      NA
C     numeric   48    1      NA
D     numeric   48    1      NA
E     numeric   48    1      NA

或者,使用过滤器,不会返回函数F

> L[L$Type != "function",]
     Type Size Rows Columns
A numeric   48    1      NA
B numeric   48    1      NA
C numeric   48    1      NA
D numeric   48    1      NA
E numeric   48    1      NA

答案 5 :(得分:0)

我将此功能保留在.rprofile中。我不经常使用它,但是当我在我的全局环境中有多个环境,功能和对象时它很棒。显然不如BenBarnes的解决方案那么优雅,但我永远不必记住语法,只需根据需要调用lsa()即可。这也允许我列出特定的环境。例如lsa(e)

lsa <- function(envir = .GlobalEnv) {
    obj_type <- function(x) {
        class(get(x))
    }
    lis <- data.frame(sapply(ls(envir = envir), obj_type))
    lis$object_name <- rownames(lis)
    names(lis)[1] <- "class"
    names(lis)[2] <- "object"
    return(unrowname(lis))
}