2012-08-29 10 views
6

Tengo cerca de 30 funciones para un proyecto de investigación y no quieren que escriba¿Usar source() en un bucle para cargar automáticamente mis funciones?

source(paste("C:/functions","/function1.txt",sep=""))

30 veces en C:/functions es mi directorio de funciones y /function1.txt es una función particular.

He intentado

files <- list.files("C:/functions") 
sapply(1:length(files),source(paste("C:/functions/",files[i],sep=""))) 

Y no funciona. Mensaje de error: Error in match.fun(FUN) : c("'source(paste(\"C:/functions/\", ' is not a function, character or symbol", "' files[i], sep = \"\"), TRUE)' is not a function, character or symbol")

También lo probé con un lazo for y no funciona.

+1

Tenga en cuenta que la edición que hizo hace algunas partes de su pregunta no tiene mucho sentido. Por ejemplo ... lo que tiene ahora realmente funciona y no se correspondería con el error que ha publicado. – Dason

+0

Se ha cambiado. –

Respuesta

6

Se proporciona un código R para obtener un directorio de archivos en la ayuda ?source. En particular:

## If you want to source() a bunch of files, something like 
## the following may be useful: 
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") 
    } 
} 

llamar a la función, simplemente tener algo como:

sourceDir("C:/function") 

Siempre se puede poner la función en su Rprofile.


Una cosa sin importancia, tiene una extensión de archivo de .txt, esto significa en la función anterior que iba a cambiar el comparador de patrón a:

pattern = "\\.txt$" 
4
files <- list.files("C:/functions") 
sapply(files, function(x) source(paste0("C:/functions/", x))) 

Tenga en cuenta que sapply requiere una función como el segundo argumento

6

Ligero cambio de la respuesta de seancarmody:

files <- list.files("C:/functions",full.names=TRUE,pattern="\\.txt") 
sapply(files, source) 
10

Si usted tiene una colección de demasiadas funciones, también se puede crear un paquete de R. Ventajas:

  • Una buena manera de incluir documentación junto con sus funciones, especialmente al utilizar roxygen2.
  • Forma fácil de distribuir su código a otras personas.
  • Las pruebas se pueden incluir con el código fuente.
  • Carga fácil de todas sus funciones usando library.
  • La capacidad de exponer únicamente las funciones de nivel superior al usuario, deja las de bajo nivel solo para uso interno.

Para obtener más información, me remito a Writing R extensions.

+0

Mejor respuesta que la mía, aunque requiriendo un poco más de esfuerzo :-) –

1

No hace daño alejarse del paradigma de Matlab de "una función por archivo". Puede poner todas sus funciones en un solo archivo my_research_functions.R, y luego simplemente hacer source('C:/functions/my_research_functions.R')

2

Quizás le guste esto ...

install.packages('R.utils') 
library(R.utils) 
sourceDirectory('C:/functions', '*.txt') 

Ver? SourceDirectory por la bondad de abastecimiento ...

Arguments 

path  
A path to a directory to be sourced. 

pattern 
A regular expression file name pattern to identify source code files. 

recursive 
If TRUE, subdirectories are recursively sourced first, otherwise not. 

envir 
An environment in which the code should be evaluated. 

onError 
If an error occures, the error may stop the job, give a warning, or silently be skipped. 

verbose 
A logical or a Verbose object. 

... 
Additional arguments passed to sourceTo(). 
Cuestiones relacionadas