2012-09-17 3 views
7

Ich möchte alle Funktionen in meinem aktuellen Arbeitsbereich finden und über die Verwendung is.function für diesen Zweck gedacht.Suche nach allen Funktionen im aktuellen Arbeitsbereich

Das „Problem“ ist, dass is.function erwartet eine echte R Objekt, nicht die Zeichenfolge Name eines Objekts.

Das ist meine Lösung, aber mit eval(substitute(...)) scheint ein bisschen beteiligt. Irgendwelche Ideen für einen geradlinigeren Weg oder ist das der einzige Weg, dies zu tun?

Beispiel Inhalt

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

alle Funktion Objekte finden

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 

Antwort

8

Wie wäre es

lsf.str() 

, die alle Funktionen auflisten sollte.

+0

+1 für den Zeiger auf 'lsf.str()', wusste das vorher nicht! Dieser scheint mir genau das zu erreichen, was ich mit einem Einzeiler anstrebe: 'funs <- as.character (lsf.str())'. Danke vielmals! – Rappster

+0

@Rappster, abhängig davon, was Sie mit dem Ergebnis tun möchten, ist die Verwendung von 'as.character' möglicherweise nicht notwendig, da' lsf.str' im Wesentlichen einen Zeichenvektor von Funktionsnamen zurückgibt. Es ist nur, dass das Objekt der Klasse "ls_str" ist, für die es eine 'print' Methode gibt. – BenBarnes

+0

Großartig, danke für diesen Kommentar. – Rappster

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

+ 1, um mich an das gute alte 'get()' zu erinnern. Danke, Mann! – Rappster

1

ich vor einiger Zeit ein allgemeineres Spielzeug schrieb: kann

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 Danke, ich bin mir sicher, dass das irgendwann nützlich sein wird! – Rappster

0

Sie eApply verwenden:

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

... oder sapply mit as.list:

which(sapply(as.list(.GlobalEnv), is.function))