我有大约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
循环,但它不起作用。
答案 0 :(得分:10)
如果你有许多功能的集合,你也可以创建一个R包。优点:
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')