当我们定义了数十个函数 - 可能是开发一个新包时 - 很难通过ls()
命令找出许多函数名中特定变量的名称。
在大多数情况下,我们不会寻找函数名称 - 我们已经知道它们存在 - 但我们想要找到我们为变量赋予的名称。
非常感谢任何解决它的想法。
答案 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))
}