在R
中,我目前有很多文件夹,在每个文件夹中,我有一个不同的.RData
文件。每个RData
文件都有不同的名称,但始终以"arg"
开头。例如,"arg_233_1_1.RData"
,"arg_233_1_2.RData"
等
有没有办法只使用正则表达式等加载这些文件,只需调用'arg'
?
例如,这不起作用:
load("arg*.RData")
但是这种味道有效吗?感谢。
答案 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)
将返回list
个environment
,这通常足够好。为此,您可以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的其他一些访问机制。)