我有一个包含各种对象的Rdata
文件:
New.Rdata
|_ Object 1 (e.g. data.frame)
|_ Object 2 (e.g. matrix)
|_...
|_ Object n
当然我可以使用load('New.Rdata')
加载数据框,但是,是否有一种智能方法可以从该文件中仅加载一个特定对象并丢弃其他对象?
答案 0 :(得分:65)
.RData文件没有索引(内容被序列化为一个大型的pairlist)。你可以通过一种方式来完成你所喜欢的参赛作品,但这并不容易,因为你不能在R级别这样做。
但是,您可以简单地将.RData文件转换为延迟加载数据库,该数据库分别序列化每个条目并创建索引。好消息是加载是按需的:
# convert .RData -> .rdb/.rdx
e = local({load("New.RData"); environment()})
tools:::makeLazyLoadDB(e, "New")
加载数据库然后只加载索引而不加载内容。内容在使用时加载:
lazyLoad("New")
ls()
x # if you had x in the New.RData it will be fetched now from New.rdb
与load()
一样,您可以指定要加载的环境,这样您就不需要污染全局工作区等。
答案 1 :(得分:15)
您可以使用attach
而非load
将数据对象附加到搜索路径,然后您可以复制您感兴趣的一个对象并分离.Rdata对象。
这仍然可以加载所有内容,但是比将所有内容加载到全局工作区(可能会覆盖您不想覆盖的内容)然后删除所有您不想要的内容更简单。
答案 2 :(得分:4)
Simon Urbanek的回答非常非常好。缺点是如果要保存的对象太大,它似乎不起作用:
tools:::makeLazyLoadDB(
local({
x <- 1:1e+09
cat("size:", object.size(x) ,"\n")
environment()
}), "lazytest")
size: 4e+09
Error: serialization is too large to store in a raw vector
我猜这是由于R的当前实现的限制(我有2.15.2),而不是耗尽物理内存和交换。但是,saves包可能是某些用途的替代方案。
答案 3 :(得分:0)
函数可用于提取单个对象,而无需加载 RData 文件中的所有内容。
extractorRData <- function(file, object) {
#' Function for extracting an object from a .RData file created by R's save() command
#' Inputs: RData file, object name
E <- new.env()
load(file=file, envir=E)
return(get(object, envir=E, inherits=F))
}
在此处查看完整答案。 https://stackoverflow.com/a/65964065/4882696