En R, estoy usando source()
para cargar algunas funciones:
source("functions.R")
¿Es posible obtener la lista de todas las funciones definidas en este archivo? Como nombres de funciones. (¿Tal vez source()
sí mismo de alguna manera puede devolverlo?).
PD: El último recurso sería llamar por source()
segunda vez como local({ source(); })
y luego hacer ls()
funciones internas y filtrar, pero eso es demasiado complicado: ¿hay una solución más fácil y menos torpe?
source()
, pero este viejo hilo puede ser de su interés.envir <- new.env() source("functions.R", local=envir) lsf.str(envir)
Respuestas:
Creo que la mejor manera sería obtener el archivo en un entorno temporal. Consulte ese entorno para todas las funciones, luego copie esos valores en el entorno principal.
fuente
new.env()
lugar del elegante,local({ })
no estoy seguro de si funcionaría con elassign
marco principal.local()
? Y por cierto, 2) lo que haces en el bucle for: ¿no hay alguna función para fusionar entornos?attach
se puede utilizar para, bueno, unir un entorno a otro. Aunque debe usar elpos
argumento en lugar de especificar elparent.frame
. Y solo funcionará bien para copiar todo el entorno, elfor
bucle de MrFlick le permite copiar solo las funciones.Es un poco torpe, pero podría ver los cambios en los objetos antes y después de la
source
llamada de esta manera.fuente
Creo que esta expresión regular captura casi todos los tipos válidos de funciones (operador binario, funciones de asignación) y todos los caracteres válidos en el nombre de una función, pero es posible que haya perdido un caso límite.
fuente
.
y funciones de asignación (`foo<-`<- function(x, value)
existen.=
para asignación, esto no captará ninguna de mis funciones ...` d d` <- function(x)
que actualmente no están atrapadas. No quiero que la expresión regular se vuelva demasiado tonta, aunque podría volver a visitarla.assign
,<<-
y->
. Y será muy difícil hacer que este enfoque tenga en cuenta las funciones que se definen dentro de las funciones, pero que en realidad no se encuentran en el entorno de origen. Su respuesta debería funcionar muy bien para los casos estándar, pero en realidad no desea escribir un analizador R a partir de expresiones regulares.Si este es su propio script para que tenga control sobre cómo está formateado, una simple convención sería suficiente. Solo asegúrese de que cada nombre de función comience en el primer carácter de su línea y que la palabra
function
también aparezca en esa línea. Cualquier otro uso de la palabrafunction
debe aparecer en una línea que comienza con un espacio o tabulación. Entonces una solución de una línea es:Las ventajas de este enfoque son que
Es muy simple . Las reglas simplemente se establecen y solo se necesita una línea simple de código R para extraer los nombres de las funciones. Regex también es simple y para un archivo existente es muy fácil de verificar, solo haga clic en la palabra
function
y verifique si cada aparición que se muestra sigue la regla.No es necesario ejecutar la fuente. Es completamente estático .
en muchos casos no necesitará cambiar el archivo fuente en absoluto y en otros habrá cambios mínimos. Si está escribiendo el guión desde cero con esto en mente, es aún más fácil de organizar.
Hay muchas otras alternativas a lo largo de la idea de convenciones. podría tener una expresión regular más sofisticada o podría agregar
# FUNCTION
al final de la primera línea de cualquier definición de función si está escribiendo el script desde cero y luego extrae esa frase y extrae la primera palabra en la línea, pero la sugerencia principal aquí parece particularmente atractivo debido a su simplicidad y las otras ventajas enumeradas.Prueba
fuente
lapply(x, function(y) dostuff(y))
rompería esto# TODO
todo mi código para poder hacer mis tareas, por ejemplo. Otra posibilidad en la misma línea sería escribir# FUNCTION
al final de la primera línea de cualquier definición de función.Esto adapta el código utilizado en la publicación de mi comentario para buscar una secuencia de tokens (símbolo, operador de asignación, luego función), y debe tomar cualquier función definida. No estoy seguro de si es robusto como la respuesta de MrFlick, pero es otra opción:
fuente