Creé un script de utilidad R, util.R, que quiero usar de otros scripts en mi proyecto. ¿Cuál es la forma correcta de garantizar que la función que define este script esté disponible para funcionar en mis otros scripts?
Estoy buscando algo similar a la require
función, que cargue un paquete solo si aún no se ha cargado. No quiero llamar source("util.R")
porque eso cargará el script cada vez que se llame.
Sé que obtendré algunas respuestas diciéndome que cree un paquete, como en Organizar el código fuente de R :) Pero no estoy creando algo que se usará en otro lugar, es solo un proyecto independiente.
Respuestas:
Aquí hay una forma posible. Use la
exists
función para buscar algo único en suutil.R
código.Por ejemplo:
(Editado para incluir
mode="function"
, como señaló Gavin Simpson)fuente
exists()
- necesitamode = "function"
agregarse para que sea infalibleexists()
parece arrojar un error excepto por devolver uno en R 3.0.2.No existe tal cosa incorporada, ya que R no rastrea las llamadas ay
source
no puede averiguar qué se cargó desde dónde (este no es el caso cuando se usan paquetes). Sin embargo, puede usar la misma idea que en los.h
archivos C , es decir, envolver todo en:fuente
source("util.R")
dentro delif
código, ¿verdad?Say
util.R
produce una funciónfoo()
. Puede verificar si esta función está disponible en el entorno global y obtener el script si no lo está:Que encontrará cualquier cosa con el nombre
foo
. Si desea encontrar una función, entonces (como lo menciona @Andrie)exists()
es útil pero necesita que le digan exactamente qué tipo de objeto buscar, por ejemploAquí está
exists()
en acción:fuente
grepl(..., value=TRUE)
porque su término de búsqueda probablemente no sea una expresión regular. +1, por cierto.grepl()
no tiene argumentovalue
, pero probablemente debería arreglar la expresión regular enls()
...fixed=TRUE
exists()
es mejor, pero ahora veo que ha publicado una respuesta de este tipo mientras tanto.Podría escribir una función que tome un nombre de archivo y un nombre de entorno, verifique si el archivo se ha cargado en el entorno y,
sys.source
si no, lo utiliza para obtener el archivo.Aquí hay una función rápida y no probada (¡mejoras bienvenidas!):
fuente
Aquí hay una función que escribí. Envuelve la
base::source
función para almacenar una lista de archivos de origen en una lista de entorno global llamadasourced
. Solo volverá a generar un archivo si proporciona un.force=TRUE
argumento a la llamada a la fuente. Su firma de argumento es por lo demás idéntica a la real,source()
por lo que no necesita reescribir sus scripts para usar esto.Es bastante hablador (muchas llamadas a
message()
), por lo que puede quitar esas líneas si le importa. Se agradece cualquier consejo de los usuarios veteranos de R; Soy bastante nuevo en R.fuente
Resolví mi problema usando la dirección completa donde está mi código: Antes:
Después:
fuente