首页 > 解决方案 > 在 R 中,如果我在“arg_233_1_3.RData”下有一个 RData 文件,我如何仅通过指定“arg”来调用它?

问题描述

R中,我目前有很多文件夹,并且在每个文件夹中,我都有不同的.RData文件。每个RData文件都有不同的名称,但总是以"arg". 例如, "arg_233_1_1.RData","arg_233_1_2.RData"等。

有没有办法通过调用正则表达式等来加载这些文件'arg'

例如,这不起作用:

load("arg*.RData")

但是有没有这种味道有效的东西?谢谢。

标签: rregex

解决方案


根据@MrFlick 的评论,有两个工具会有所帮助:

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

  • 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)

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

访问 anenvironment实际上与访问lists 相同,尽管存在一些细微差别(例如,不能按位置索引;那是e <- new.env(); e[[1]]行不通的),您应该没问题。如果你真的必须有嵌入式列表,你可以使用as.list(e). (列出了一些其他访问器机制https://gist.github.com/hadley/5434786。)


推荐阅读