2012-09-17 12 views
7

Mi piacerebbe trovare tutte le funzioni nel mio spazio di lavoro corrente e ho pensato di utilizzare is.function per questo scopo.Trovare tutte le funzioni nello spazio di lavoro corrente

Il "problema" è che is.function si aspetta una vera e propria R oggetto, non la stringa di caratteri nome di un oggetto.

Questa è la mia soluzione, ma l'utilizzo di eval(substitute(...)) sembra un po 'complicato. Qualche idea per un modo più diretto o è l'unico modo in cui questo può essere fatto?

contenuti Esempio

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

Trovare tutte le funzioni oggetti

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 

risposta

8

Come su

lsf.str() 

che dovrebbe elencare tutte le funzioni.

+0

+1 per il puntatore a 'lsf.str()', non lo sapeva prima! Questo mi sembra esattamente quello che sto cercando con un solo liner: 'funs <- as.character (lsf.str())'. Molte grazie! – Rappster

+0

@Rappster, a seconda di cosa si vuole fare con il risultato, usare 'as.character' potrebbe non essere necessario, dato che' lsf.str' restituisce essenzialmente un vettore di caratteri di nomi di funzioni. È solo che l'oggetto è di classe 'ls_str', per cui esiste un metodo' print'. – BenBarnes

+0

Grande, grazie per quel commento. – Rappster

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

+ 1 per ricordarmi del buon vecchio 'get()'. Grazie uomo! – Rappster

1

ho scritto un giocattolo più generale un po 'indietro:

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 Grazie, sono sicuro che a un certo punto diventerà utile! – Rappster

0

È possibile utilizzare eapply:

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

... o sapply con as.list:

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