我有一个包含各种对象的Rdata
文件:
New.Rdata
|_ Object 1 (e.g. data.frame)
|_ Object 2 (e.g. matrix)
|_...
|_ Object n
当然我可以用 load('New.Rdata')
来加载数据框,但是有没有一种聪明的方法来仅加载文件中的一个特定对象并丢弃其他对象呢?我有一个包含各种对象的Rdata
文件:
New.Rdata
|_ Object 1 (e.g. data.frame)
|_ Object 2 (e.g. matrix)
|_...
|_ Object n
当然我可以用 load('New.Rdata')
来加载数据框,但是有没有一种聪明的方法来仅加载文件中的一个特定对象并丢弃其他对象呢?.RData文件没有索引(内容被序列化为一个大的pairlist)。您可以通过一些hack方法遍历pairlist并仅分配所需的条目,但这并不容易,因为您无法在R级别上执行此操作。
不过,您可以将.RData文件简单地转换为lazy-load数据库,该数据库将每个条目单独序列化并创建索引。好处是加载是按需进行的:
# 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()
中一样,你可以指定一个环境来加载,这样就不必污染全局工作区等。
New.rdb
中寻找x
的开头,并仅加载x
。 - Simon Urbanekattach
而不是 load
,这将把数据对象附加到搜索路径上,然后您可以复制您感兴趣的一个对象并分离 .Rdata 对象。 这仍然会加载所有内容,但比将所有内容加载到全局工作区更容易处理(可能会覆盖您不想被覆盖的内容),然后再丢弃您不想要的所有内容。someObj
从 someFile.RData
中的示例:attach('someFile.RData'); someObj <- someObj; detach('file:someFile.RData')
。 - C8H10N4O2detach()
而不需要任何参数,它就会分离文件。这样更快更简单;你的方法更安全。 - Greg SnowSimon 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包可能是某些情况下的替代选择。
函数可用于从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
这篇博客文章提供了一个整洁的实践方法,可以在第一个问题中防止此类问题。其要点是使用saveRDS(),loadRDS()
函数而不是常规的save(),load()
函数。