2010-11-29 13 views
6

Estoy usando R, en Linux. Tengo un conjunto de funciones que utilizo a menudo y que he guardado en diferentes archivos de script .r. Esos archivos están en ~/r_lib /.Haga que R busque archivos en un directorio de biblioteca

Me gustaría incluir esos archivos sin tener que usar el nombre completo, sino solo "file.r". Básicamente, estoy buscando el mismo comando que -I en el compilador de C++.

¿Hay alguna manera de establecer el archivo de inclusión de R, en el archivo .Rprofile o .Renviron?

Gracias

+1

para adoptar un enfoque ligeramente diferente, podría considerar envolver 'file.r' en un paquete para usted. Tuve un flujo de trabajo similar al suyo durante mucho tiempo, y luego alguien me señaló en dirección a [roxygen] (http://roxygen.org/). Como había comentado el archivo inicial con bastante diligencia, era una tarea muy trivial convertirlo en el formato roxygen. – Chase

+0

Crea tu propio paquete con todas tus funciones en la punta de los dedos. Es fácil como un pastel o más fácil. He grabado mi experiencia aquí: http://danganothererror.wordpress.com/2010/07/23/building-an-r-package-under-windows-without-cc-or-fortran-code/ –

Respuesta

5

Usted puede utilizar la función sourceDir en la sección Ejemplos de ?source:

sourceDir <- function(path, trace = TRUE, ...) { 
    for (nm in list.files(path, pattern = "\\.[RrSsQq]$")) { 
     if(trace) cat(nm,":")   
     source(file.path(path, nm), ...) 
     if(trace) cat("\n") 
    } 
} 

Y es posible que desee utilizar sys.source para evitar estorbar su entorno global.

+0

Buen punto re ' sys.source'. –

0

Obtener todos los archivos de su directorio, en su caso

d <- list.files("~/r_lib/") 

, puede cargar con una función de la plyr paquete

library(plyr) 
l_ply(d, function(x) source(paste("~/r_lib/", x, sep = ""))) 

Si lo desea, también puede hacerlo en un bucle o usar una función diferente en lugar de l_ply. bucle convencional:

for (i in 1:length(d)) source(paste("~/r_lib/", d[[i]], sep = "")) 
0

Escriba su propia envoltura source()?

mySource <- function(script, path = "~/r_lib/", ...) { 
    ## paste path+filename 
    fname <- paste(path, script, sep = "") 
    ## source the file 
    source(fname, ...) 
} 

Se puede pegar que en su .Rprofile hacer es se cargará cada vez que inicie R.

Si desea cargar todos los archivos de R, se puede extender por encima de la facilidad a la fuente de todos los archivos a una vez

mySource <- function(path = "~/r_lib/", ...) { 
    ## list of files 
    fnames <- list.files(path, pattern = "\\.[RrSsQq]$") 
    ## add path 
    fnames <- paste(path, fnames, sep = "") 
    ## source the files 
    lapply(fnames, source, ...) 
    invisible() 
} 

En realidad, sin embargo, que sería mejor comenzar su propio paquete privado y cargar eso.

+0

Generalmente es mejor usar 'file.path' para crear rutas. – hadley

1

Si configura el parámetro chdir del origen en TRUE, entonces las llamadas source dentro del archivo incluido serán relativas a su ruta. Por lo tanto, puede llamar a:

source("~/r_lib/file.R",chdir=T) 

Probablemente sería mejor no tener llamadas de fuente dentro de su "biblioteca" y hacer que su código en un paquete, pero a veces esto es conveniente.

+0

Vea el argumento 'chdir' para' fuente' – hadley

+0

@hadley ¡Gracias! He actualizado mi respuesta en consecuencia. Busqué un argumento como 'fuente', pero obviamente no lo suficiente. – Jonathan

Cuestiones relacionadas