首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何减少我正在构建的数据R包的安装时间?

如何减少我正在构建的数据R包的安装时间?
EN

Stack Overflow用户
提问于 2022-08-03 16:44:42
回答 1查看 88关注 0票数 4

Q的替代措辞:是什么因素决定了R包安装的步骤的壁时间?

我正在开发一个R软件包,使用户更容易访问财团的数据。data目录的大小为4.5G,其中所有对象都使用bzip2进行压缩。有202个单独的.RData文件,范围从133 B到24 to压缩。

当我安装软件包时,输出如下所示:

代码语言:javascript
复制
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/中。我特别想知道是否有一种方法可以在安装包时加快延迟加载步骤。

EN

回答 1

Stack Overflow用户

发布于 2022-08-03 17:52:35

我想您是在将数据添加到/data文件夹。另一种方法是将其放在inst/下;例如,inst/extdata/和通过使用为system.file("extdata/mydataset.Rds", package="foo")提供的路径,使包中的函数可以加载。然后,您需要调用该助手函数来获取数据。

例如,对于特定的数据集,如下所示:

代码语言:javascript
复制
loadPackageData <- function() {
  readRDS(system.file("extdata/foo.Rds", package="bar"))
}

编辑:可以加载多个数据集的

代码语言:javascript
复制
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)

自动完成也将在这里工作。

一种更为传统的办法可以是:

代码语言:javascript
复制
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

当然,您可以扩展这一点,并定义如果您请求多个数据集(在向量中),等等(例如,在列表中组合,或者如果数据集相似,则将它们组合成一个数据集)。

如果系统地命名数据集,人们也可以想象出备选方案。

在任何情况下,您的想法是让它加载一个函数调用。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73224933

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档