繁体   English   中英

如何检查当前会话 R 中加载的文件 .rdata 的名称

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM