我有一个Rdata包含各种对象的文件:
New.Rdata
|_ Object 1 (e.g. data.frame)
|_ Object 2 (e.g. matrix)
|_...
|_ Object n
Run Code Online (Sandbox Code Playgroud)
当然我可以加载数据框load('New.Rdata'),但是,是否有一种智能方法只从该文件中加载一个特定对象并丢弃其他对象?
Sim*_*nek 69
.RData文件没有索引(内容被序列化为一个大型的pairlist).你可以通过一种方式来浏览一下pairlist并只分配你喜欢的条目,但这并不容易,因为你无法在R级别进行.
但是,您可以简单地将.RData文件转换为延迟加载数据库,该数据库分别序列化每个条目并创建索引.好处是加载将是按需的:
# convert .RData -> .rdb/.rdx
e = local({load("New.RData"); environment()})
tools:::makeLazyLoadDB(e, "New")
Run Code Online (Sandbox Code Playgroud)
加载数据库然后只加载索引而不加载内容.内容在使用时加载:
lazyLoad("New")
ls()
x # if you had x in the New.RData it will be fetched now from New.rdb
Run Code Online (Sandbox Code Playgroud)
就像load()你可以指定一个加载的环境,所以你不需要污染全局工作区等.
Gre*_*now 16
您可以使用attach而不是load将数据对象附加到搜索路径,然后您可以复制您感兴趣的一个对象并分离.Rdata对象.
这仍然可以加载所有内容,但是比将所有内容加载到全局工作区(可能会覆盖您不想覆盖的内容)然后删除您不想要的所有内容更简单.
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
Run Code Online (Sandbox Code Playgroud)
我猜这是由于 R 的当前实现的限制(我有 2.15.2)而不是物理内存和交换用完。但是,saves包可能是某些用途的替代方案。
函数对于提取单个对象而不加载 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))
}
Run Code Online (Sandbox Code Playgroud)
请参阅此处的完整答案。/sf/answers/4617484581/
| 归档时间: |
|
| 查看次数: |
12728 次 |
| 最近记录: |