2012-09-17 11 views
7

Me gustaría encontrar todas las funciones en mi espacio de trabajo actual y pensé en usar is.function para tal fin.Encontrar todas las funciones en el área de trabajo actual

El "problema" es que is.function espera un cierto R objeto, no la cadena de caracteres nombre de un objeto.

Esa es mi solución, pero usar eval(substitute(...)) parece un poco complicado. ¿Alguna idea para una manera más directa o es la única forma en que esto se puede hacer?

Ejemplo contenido

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

Encontrar todos los objetos función

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 

Respuesta

8

¿Qué tal

lsf.str() 

que debería enumerar todas las funciones.

+0

+1 para el puntero a 'lsf.str()', ¡no sabía eso antes! Este parece obtener exactamente lo que busco con un solo trazo: 'funs <- as.character (lsf.str())'. ¡Muchas gracias! – Rappster

+0

@Rappster, dependiendo de lo que quiera hacer con el resultado, puede que el uso de 'as.character' no sea necesario, ya que' lsf.str' devuelve esencialmente un vector de caracteres de nombres de funciones. Es solo que el objeto es de clase 'ls_str', para el cual hay un método' print'. – BenBarnes

+0

Genial, gracias por ese comentario. – Rappster

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

+ 1 por recordarme el buen viejo 'get()'. ¡Gracias hombre! – Rappster

1

me escribió un juguete más general hace un tiempo:

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 ¡Gracias, estoy seguro de que será útil en algún momento! – Rappster

0

Puede utilizar eapply:

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

... o sapply con as.list:

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