Q的替代措辞:是什么因素决定了R包安装的步骤的壁时间?
我正在开发一个R软件包,使用户更容易访问财团的数据。data目录的大小为4.5G,其中所有对象都使用bzip2进行压缩。有202个单独的.RData文件,范围从133 B到24 to压缩。
当我安装软件包时,输出如下所示:
Downloading GitHub repo mypackage@HEAD
✓ checking for file ‘.../mypackage-1c6478a/DESCRIPTION’ ...
─ preparing ‘mypackage’:
✓ checking DESCRIPTION meta-information
─ checking for LF line-endings in source and make files and shell scripts
─ checking for empty or unneeded directories
─ building ‘mypackage_1.0.0.tar.gz’ (1.3s)
* installing *source* package ‘mypackage’ ...
** using staged installation
** R
** data
*** moving datasets to lazyload DB
** inst
** byte-compile and prepare package for lazy loading
** help
*** installing help indices
** building package indices
** testing if installed package can be loaded from temporary location
** testing if installed package can be loaded from final location
** testing if installed package keeps a record of temporary installation path
* DONE (mypackage)*** moving datasets to lazyload DB步骤花费的时间最长,大约5分钟。是什么决定了这一步的时间?物体的数量?物体的大小?文件压缩?我能做些什么让它安装得更快吗?
编辑:--我确实希望所有的R对象都是延迟加载的,并且我希望它们都有附带的文档,所以我认为最好的做法是将.rda文件保存在data/中。我特别想知道是否有一种方法可以在安装包时加快延迟加载步骤。。。
发布于 2022-08-03 17:52:35
我想您是在将数据添加到/data文件夹。另一种方法是将其放在inst/下;例如,inst/extdata/和通过使用为system.file("extdata/mydataset.Rds", package="foo")提供的路径,使包中的函数可以加载。然后,您需要调用该助手函数来获取数据。
例如,对于特定的数据集,如下所示:
loadPackageData <- function() {
readRDS(system.file("extdata/foo.Rds", package="bar"))
}编辑:可以加载多个数据集的:
bar_data_files <- list.files(system.file("extdata", package = "bar"),
pattern = "\\.Rds$", full.names = TRUE)
barData <- setNames(lapply(bar_data_files, function(f) readRDS(f)),
tools::file_path_sans_ext(basename(bar_data_files)))
# Then to get the foo dataset:
barData$foo()
# Or view the dataset names:
names(barData)自动完成也将在这里工作。
一种更为传统的办法可以是:
loadBarData <- function(dataset) {
bar_data_files <- list.files(".", #system.file("extdata", package = "bar"),
pattern = "\\.Rds$", full.names = TRUE)
files_sans_ext <- tools::file_path_sans_ext(basename(bar_data_files))
if (missing(dataset)) {
print(files_sans_ext)
} else {
if (!(dataset %in% files_sans_ext)) {
stop("Could not match dataset", dataset)
} else {
readRDS(bar_data_files[match(dataset, files_sans_ext)])
}
}
}
loadBarData() # List all available datasets
loadBarData("foo") # Loads "foo" is foo is found当然,您可以扩展这一点,并定义如果您请求多个数据集(在向量中),等等(例如,在列表中组合,或者如果数据集相似,则将它们组合成一个数据集)。
如果系统地命名数据集,人们也可以想象出备选方案。
在任何情况下,您的想法是让它加载一个函数调用。
https://stackoverflow.com/questions/73224933
复制相似问题