2012-09-17 28 views
7

我想查找當前工作區中的所有功能,並考慮使用is.function來達到此目的。查找當前工作區中的所有功能

「問題」是is.function期望一個真正ř對象,而不是字符串名稱的對象的

這是我的解決方案,但使用eval(substitute(...))似乎有點涉及。任何更直接的方式的想法還是唯一的辦法可以做到這一點?

示例內容

x <- TRUE 
y <- 10 
foo1 <- function() message("hello world!") 
foo2 <- function() message("hello world again!") 

找到所有的函數對象

wscontent <- ls(all.names=TRUE) 
funs <- sapply(wscontent, function(ii) { 
    eval(substitute(is.function(OBJ), list(OBJ=as.name(ii)))) 
}) 
> funs 
    foo1  foo2  funs wscontent   x   y 
    TRUE  TRUE  FALSE  FALSE  FALSE  FALSE 

回答

8

如何

lsf.str() 

其中應列出所有功能。

+0

用於指向'lsf.str()'的指針+1,之前不知道那個!這一個似乎讓我完全得到我以後的一句話:'funs < - as.character(lsf.str())'。非常感謝! – Rappster

+0

@Rappster,根據你想要對結果做什麼,使用'as.character'可能不是必需的,因爲'lsf.str'基本上返回一個函數名的字符向量。只是該對象是類'ls_str',爲此它有一個'print'方法。 – BenBarnes

+0

太好了,謝謝你的評論。 – Rappster

1
funs <- sapply(wscontent, function(x) is.function(get(x))) 
+0

+ 1讓我想起那個古老的'get()'。謝啦! – Rappster

1

我寫了一個更一般的玩具,而回:

lstype<-function(type='closure'){ 
inlist<-ls(.GlobalEnv) 
if (type=='function') type <-'closure' 
typelist<-sapply(sapply(inlist,get),typeof) 
return(names(typelist[typelist==type])) 
} 
+0

+1謝謝,我相信這會在某些時候變得方便! – Rappster

0

可以eapply使用:

which(unlist(eapply(.GlobalEnv, is.function))) 

...或sapply與as.list:

which(sapply(as.list(.GlobalEnv), is.function)) 
相關問題