2010-11-24 18 views
14

Me gustaría recibir una llamada que me devuelva un vector con los nombres de todas las funciones que podría llamar en la sesión R actual. ¿Alguien sabe cómo lograr esto?¿Hay alguna manera de obtener un vector con el nombre de todas las funciones que uno podría usar en R?

(me gustaría comprobar usuario ha introducido las variables contra este vector tuvimos algún problema imprevisto con los usuarios entrar por ejemplo, c como nombres de variables.)

ACTUALIZACIÓN: me gustaría obtener los nombres de las funciones de todo paquetes actualmente cargados.

SOLUCIÓN (a mitad de camino): Sobre la base de la punta Joris Meys con lsf.str() me ocurrió la siguiente función que devuelve un vector ordenada con todos los nombres de las funciones disponibles en la actualidad:

getFunctionNames <- function() { 
    loaded <- (.packages()) 
    loaded <- paste("package:", loaded, sep ="") 
    return(sort(unlist(lapply(loaded, lsf.str)))) 
} 

Bu, t ver también los comentarios sobre la publicación de Joris Meys para respuestas aún mejores.

+0

Re su actualización, he añadido una versión modificada de findfuns() que hace exactamente eso. –

+1

Puede simplemente cargar <- search() [- 1], luego evita la función de pegar. Asegúrese de comprobar si su devolución da un vector bien formado. En mi versión R tuve que anidar el carácter as en la aplicación para obtener una lista limpia de los nombres de las funciones en lugar de un montón de texto confuso con los nombres de las funciones ocultos en algún lugar. Ver también mi edición. –

Respuesta

15

Yo usaría lsf.str() como un comienzo.

por ejemplo: x <- as.character(lsf.str("package:base")) le da una lista de todas las funciones en el paquete base. Podría agregar todos los paquetes con los que desea verificar. stats y utils vienen a la mente primero.

EDIT: Respecto a su pregunta acerca de los paquetes cargados actualmente:

x < - no listados (sapply (búsqueda() [- 1], la función (x) as.character (lsf.str (x))))ver los comentarios

pkgs <- search() 
pkgs <- pkgs[grep("package:",pkgs)] 
y <- unlist(sapply(pkgs,lsf.str)) 

hace el truco.

+0

Tengo la impresión, la parte 'as.character' no es necesaria. Entonces: 'y <- unlist (sapply (search() [- 1], lsf.str))' también funciona. – Henrik

+0

@Henrik: correcto, ajusto –

+0

@Joris: tenga en cuenta que otras cosas podrían estar en la ruta de búsqueda (objetos adjuntos [eughh yuck!]), Posiblemente entornos (?)) Por lo que tal vez sea mejor usar las que tienen '" paquete: "' en ellos. –

6

me preguntó un Q similares en I-Help hace muchas lunas (2007) y el Prof. Brian Ripley proporcionan esto como una solución:

findfuns <- function(x) { 
    if(require(x, character.only=TRUE)) { 
     env <- paste("package", x, sep=":") 
     nm <- ls(env, all=TRUE) 
     nm[unlist(lapply(nm, function(n) exists(n, where=env, 
               mode="function", 
               inherits=FALSE)))] 
    } else character(0) 
} 
pkgs <- dir(.Library) 
z <- lapply(pkgs, findfuns) 
names(z) <- pkgs 
Z <- sort(unique(unlist(z))) 

cual da salida como:

> head(Z) 
[1] "^"  "-"  "-.Date" "-.POSIXt" ":"  "::" 

Este fue para encontrar todas las funciones en los paquetes especificados por el objeto pkgs para que pueda controlar qué paquetes se cargan/contrastan.

Una versión que funciona en el conjunto que está cargado de paquetes sería modificado:

findfuns2 <- function(pkgs) { 
    nm <- ls(pkgs, all = TRUE) 
    nm[unlist(lapply(nm, function(n) exists(n, where = pkgs, 
              mode = "function", 
              inherits = FALSE)))] 
    if(isTRUE(all.equal(length(nm), 0))) 
     character(0) 
    else 
     nm 
} 

pkgs <- search() 
pkgs <- pkgs[grep("package:", pkgs)] 
z <- lapply(pkgs, findfuns2) 
z <- sort(unique(unlist(z))) 
head(z) 
+0

@Gavin: ¿Qué pasa con lsf.str()? –

+0

@Joris - Nada, excepto que no sabía que existía :-) –

+1

@Joris: Solo mira 'ls.str' - básicamente está haciendo lo que Brian' findfuns() 'y mi versión modificada hacen. Supongo que no existía en 2007. –

Cuestiones relacionadas