我感兴趣的是列出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命名空间访问该对象?
我目前通过将所有内容加载到临时环境中来解决此问题,然后复制出所需内容,但这样效率很低.
Sim*_*nek 19
由于刚才引用了这个问题,我们要澄清两件事:
attach()简单地调用load()所以没有必要使用它代替load
如果您想要选择性访问以防止屏蔽,那么简单地将文件加载到新环境中会更容易:
e = local({load("foo.RData"); environment()})
Run Code Online (Sandbox Code Playgroud)
然后ls(e),您可以使用和访问内容e$x.attach如果您真的想在搜索路径上使用它,您仍然可以在环境中使用.
FWIW .RData文件没有索引(对象存储在一个大的pairlist中),因此您无法在不加载的情况下列出包含的对象.如果您想要方便的访问,请将其转换为延迟加载格式,而不是简单地添加索引,以便可以单独加载每个对象(请参阅从Rdata文件中获取特定对象)
我只是用一个env=参数load():
> x <- 1; y <- 2; z <- "foo"
> save(x, y, z, file="/tmp/foo.RData")
> ne <- new.env()
> load(file="/tmp/foo.RData", env=ne)
> ls(env=ne)
[1] "x" "y" "z"
> ne$z
[1] "foo"
>
Run Code Online (Sandbox Code Playgroud)
这种方法的成本是你确实阅读了整个RData文件---但另一方面,这似乎是不可避免的,因为没有其他方法似乎提供这样一个文件的'内容'列表.
warn.conflicts=FALSE您可以通过对 的调用进行设置来抑制警告attach。如果一个对象被全局环境中的一个对象屏蔽,您可以使用get它从附加数据中检索它。
x <- 1:10
save(x, file="x.rData")
#attach("x.rData", pos=2, warn.conflicts=FALSE)
attach("x.rData", pos=2)
(x <- 1)
# [1] 1
(x <- get("x", pos=2))
# [1] 1 2 3 4 5 6 7 8 9 10
Run Code Online (Sandbox Code Playgroud)