我有时会print( load( "myDataFile.RData" ) )在加载数据文件时列出数据文件的内容.有没有办法列出内容而不加载数据文件中包含的对象?
我感兴趣的是列出RDATA文件中的对象并仅加载选定的对象,而不是整个集合(如果有些可能很大或者可能已经存在于环境中).当名称冲突时,我不太清楚如何做到这一点,因为attach()不能很好地工作.
1:用于检查R数据文件的内容而不加载它:这个问题类似,但不同于在没有加载的R数据文件的列表内容中询问的问题
在这种情况下,提供的解决方案是:
attach(filename)
ls(pos = 2)
detach()
Run Code Online (Sandbox Code Playgroud)
如果文件中的对象与全局环境中的对象之间存在命名冲突,则会显示以下警告:
The following object(s) are masked _by_ '.GlobalEnv':
我尝试创建一个新环境,但我似乎无法附加到那个环境中.例如,这会产生相同的错误:
lsfile <- function(filename){
tmpEnv <- new.env()
evalq(attach(filename), envir = tmpEnv)
tmpls <- ls(pos = 2)
detach()
return(tmpls)
}
lsfile(filename)
Run Code Online (Sandbox Code Playgroud)
也许我用evalq(或eval)制造了一堆东西.还有其他方法可以避免命名冲突吗?
2:如果我想访问一个对象 - 如果没有命名冲突,我可以使用.rdat文件中的那个,或者将它复制到一个新文件.如果存在冲突,如何访问文件命名空间中的对象?
例如,如果我的文件是"sample.rdat",并且对象是surveyData,并且在全局环境中已经存在surveyData对象,那么如何从file:sample.rdat命名空间访问该对象?
我目前通过将所有内容加载到临时环境中来解决此问题,然后复制出所需内容,但这样效率很低.
我有一个包含许多列表的.RDS文件,它是从一台计算机创建的,该计算机的内存大于我尝试读取相同数据的内存.
有没有办法访问此内容而不将其全部加载到内存中?
这是一个例子:
listOflists <- list(list1 = list(rnorm(1000)),
list2 = list(rnorm(1000)))
saveRDS(listOflists, "listOflists.RDS")
Run Code Online (Sandbox Code Playgroud)
是否可以只读取list1而不加载整个文件?
我想仅在需要数据时使用延迟分配从一组文件中加载一系列数据。但是由于这些文件将始终位于同一目录中(可能会四处移动),而不是对每个文件的位置进行硬编码(如果移动目录,稍后更改将很乏味),我只想简单地一个接受目录文件路径的函数。
loadLayers <- function(filepath) {
delayedAssign("dataset1", readRDS(file.path(filepath, "experiment1.rds")))
delayedAssign("dataset2", readRDS(file.path(filepath, "experiment2.rds")))
delayedAssign("dataset3", readRDS(file.path(filepath,"experiment3.rds")))
return (list <- (setOne = dataset1, setTwo = dataset2, setThree = dataset3)
}
Run Code Online (Sandbox Code Playgroud)
因此,与其在开始时加载所有数据集,我希望仅在需要时才加载每个数据集(这会加快闪亮的应用程序的速度)。
但是,在函数中执行此操作时遇到了问题。当 delayAssign 不在函数中时它起作用,但是当我将它们放在函数中时,列表中的所有对象都只返回 null,并且在需要时评估它们的“承诺”似乎没有实现。
实现这一目标的正确方法是什么?谢谢。