[英]How to check name of file .rdata loaded in current session R
我有一个包含许多 *.rdata 文件的文件夹,通过单击它们可以直接打开一个工作区。 因为我同时打开了很多,所以我想知道与每个 R 控制台/工作区关联的 .rdata 文件的名称。 有没有办法在窗口顶部栏中显示 .rdata 文件名,或者至少用命令检查它?
我认为没有自动或简便的方法可以找出答案。 但是,您可以尝试假设(a)每个.Rdata
文件包含一些唯一变量名称,并且(b)(临时)加载每个文件不会造成时间限制,来找出可能的罪魁祸首 。
快速设置:
iris2 <- iris
mtcars2 <- mtcars
save(mtcars2, file="~/Downloads/mtcars.Rdata")
save(iris2, file="~/Downloads/iris.Rdata")
我单击mtcars.Rdata
,然后出现RStudio。
ls()
# [1] "mtcars2"
现在的“ hack”:
list_of_vars <- sapply(list.files(pattern = "*.Rdata"),
function(f) {
e <- new.env(parent = emptyenv())
load(f, envir = e)
ls(envir = e)
}, simplify = FALSE)
list_of_vars
# $iris.Rdata
# [1] "iris2"
# $mtcars.Rdata
# [1] "mtcars2"
Filter(function(x) all(exists(x)), list_of_vars)
# $mtcars.Rdata
# [1] "mtcars2"
这表明我双击的文件是mtcars.Rdata
。 (到目前为止,这既不健壮也不是万无一失。如果您具有可变的名称通用性,则可能不走运。)
更新 :
由于您的.Rdata
文件具有相似或相同的变量名(如果不包含内容),则可以采用上述技术来检查对象本身是否相同,而不仅仅是变量名的存在。
新设置:
mtcars2 <- mtcars
save(mtcars2, file="mtcars1.Rdata")
mtcars2$mpg[1] <- 21.1
save(mtcars2, file="mtcars2.Rdata")
检查内容:
VERBOSE <- TRUE
vars_equal <- sapply(list.files(pattern = "*.Rdata"),
function(f) {
if (VERBOSE) message(f)
e <- new.env(parent = emptyenv())
load(f, envir = e)
all(sapply(names(e), function(varname) exists(varname, envir = .GlobalEnv) && identical(e[[varname]], get(varname, envir = .GlobalEnv))))
})
vars_equal
# mtcars1.Rdata mtcars2.Rdata
# FALSE TRUE
如果您的对象很大,则将导致内存使用量的瞬时峰值。 一旦R垃圾回收, sapply
应该清除在外部sapply
内部创建的所有临时环境(以及每个.Rdata
文件中的对象)。 (这可以很容易地清理,不仅用于内存管理,而且还可以清理更鲁棒的执行。我在此不要求编码出色:-)
好问题! 我自己也在问这个! 不幸的是,我不知道比从启动 R 进程的命令行参数解析它更好的解决方案:
commandArgs()
# [1] "C:\\Program Files\\R\\R-4.0.4\\bin\\x64\\RGui.exe"
# [2] "--workspace=D:\\tomas\\ces\\gen_dat-full_test-model3,N=2000,seed=123,tr=0.6xAll.Rdata"
pat <- "^--workspace="
sub(pat, "", grep(pat, commandArgs(), value = TRUE))
# [1] "D:\\tomas\\ces\\gen_dat-full_test-model3,N=2000,seed=123,tr=0.6xAll.Rdata"
绝对不是一个理想的解决方案(我来这里是为了寻找更好的解决方案),但是由于还没有人发布更好的解决方案,所以我发布了这个。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.