在循环中使用source()来自动加载我的函数?

时间:2012-08-29 11:59:11

标签: r

我有大约30个研究项目的功能,不想输入

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

30次,其中C:/functions是我的函数目录,/function1.txt是一个特定的函数。

我试过

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

它不起作用。错误消息: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")

我也尝试使用for循环,但它不起作用。

6 个答案:

答案 0 :(得分:10)

如果你有许多功能的集合,你也可以创建一个R包。优点:

  • 在您的功能中包含文档的好方法,尤其是在使用roxygen2
  • 将代码分发给其他人的简便方法。
  • 测试可以包含在源代码中。
  • 使用library轻松加载所有功能。
  • 仅向用户公开顶级功能的能力,将低级别功能仅供内部使用。

有关详细信息,请参阅Writing R extensions

答案 1 :(得分:7)

seancarmody的回答略有变化:

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

答案 2 :(得分:6)

?source帮助中提供了一些用于获取文件目录的R代码。特别是:

## 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")
     }
}

要调用该函数,请执行以下操作:

sourceDir("C:/function")

您可以随时将该功能放入Rprofile中。


一个小问题,您的文件扩展名为.txt,这意味着在上面的函数中您可以将模式匹配器更改为:

pattern = "\\.txt$"

答案 3 :(得分:5)

files <- list.files("C:/functions")
sapply(files, function(x) source(paste0("C:/functions/", x)))

请注意sapply需要一个函数作为第二个参数。

答案 4 :(得分:2)

也许你会喜欢这个......

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

请参阅?sourceDirectory获取采购优势......

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().

答案 5 :(得分:1)

远离Matlab范式“每个文件一个函数”并没有什么坏处。您可以将所有功能放入单个my_research_functions.R文件中,然后执行source('C:/functions/my_research_functions.R')