在R中指定为字符串的源文件

时间:2019-02-14 10:45:04

标签: r string file

我想以编程方式获取用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种不同的模式,因此不能手动编写。

我该怎么做?

1 个答案:

答案 0 :(得分:1)

尝试使用dir获取文件列表,然后使用lapply:

例如,如果您的文件格式为t1.Rt2.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)