我想以编程方式获取用Sys.glob()
函数检索的给定数组中包含的所有.R文件。
这是我写的代码:
# fetch the different ETL parts
parts <- Sys.glob("scratch/*.R")
if (length(parts) > 0) {
for (part in parts) {
# source the ETL part
source(part)
# rest of code goes here
# ...
}
} else {
stop("no ETL parts found (no data to process)")
}
我的问题是我无法执行此操作,或者至少出现以下错误:
simpleError in source(part): scratch/foo.bar.com-https.R:4:151: unexpected string constant
我为source()
函数尝试了不同的组合,如下所示:
source(sprintf("./%s", part))
source(toString(part))
source(file = part)
source(file = sprintf("./%s", part))
source(file = toString(part))
没有运气。当我遍历目录的内容时,我需要告诉R来获取那些文件。由于这是一个定制的ETL(提取,转换和加载)脚本,因此我可以手动编写:
source("scratch/foo.bar.com-https.R")
source("scratch/bar.bar.com-https.R")
source("scratch/baz.bar.com-https.R")
但是那很脏,现在有3种不同的提取模式。它们可能有8种,80种甚至2000种不同的模式,因此不能手动编写。
我该怎么做?
答案 0 :(得分:1)
尝试使用dir获取文件列表,然后使用lapply:
例如,如果您的文件格式为t1.R
,t2.R
等,并且位于“ StackOverflow”路径内,请执行以下操作:
d = dir(pattern = "^t\\d.R$", path = "StackOverflow/", recursive = T, full.names = T)
m = lapply(d, source)
选项recursive = T
将搜索所有子目录,而full.names = T
将路径添加到文件名。
如果您仍然想使用Sys.glob(),那么它也可以使用:
d = Sys.glob(paths = "StackOverflow/t*.R")
m = lapply(d, source)