在R中,如果我在" arg_233_1_3.RData"下面有一个RData文件,如何通过指定" arg"来调用它?

时间:2018-05-18 20:51:35

标签: r regex

R中,我目前有很多文件夹,在每个文件夹中,我有一个不同的.RData文件。每个RData文件都有不同的名称,但始终以"arg"开头。例如,"arg_233_1_1.RData""arg_233_1_2.RData"

有没有办法只使用正则表达式等加载这些文件,只需调用'arg'

例如,这不起作用:

load("arg*.RData")

但是这种味道有效吗?感谢。

1 个答案:

答案 0 :(得分:1)

两个有用的工具,基于@ MrFlick的评论:

  • list.files(pattern="^arg.*\\.RData")将返回当前目录中与该模式匹配的所有文件。这些模式遵循 regex 规则,而不是普通的文件管理规则。

  • list.files(pattern="^arg.*\\.RData", recursive=TRUE, full.names=TRUE)将执行相同的操作,但查看当前(或path=...)目录和所有后代目录。 full.names是包含完整路径的,否则它将只返回文件名,而不是整个路径。

一旦您知道如何找到它们,就可以使用以下方法之一以编程方式加载它们:

ign <- sapply(list.files(pattern="^TEX.*up.png$"), load)

以上内容应该全部加载到全局环境中。这可能是好的(如果所有变量都是唯一的),但也可能默默地覆盖变量。

更安全的选择是将它们加载到专属列表/环境中:

full_of_arg <- sapply(list.files(pattern="^TEX.*up.png$"),
                      function(fn) { e <- new.env(parent=emptyenv()); load(fn, envir=e); e; },
                      simplify=FALSE)

将返回listenvironment,这通常足够好。为此,您可以full_of_arg[[1]]$varname在第一个arg文件中获取名为varname的变量。名称(names(full_of_arg))将告诉您从哪个文件中提取变量。

访问environment实际上与访问list相同,虽然存在一些细微差别(例如,无法按位置编制索引; e <- new.env(); e[[1]]不起作用),你应该没事。如果您确实必须拥有嵌入式列表,则可以使用as.list(e)。 (列出https://gist.github.com/hadley/5434786的其他一些访问机制。)