【问题标题】:Lazy package dependency in RR中的惰性包依赖
【发布时间】:2013-08-08 16:40:23
【问题描述】:

我想写一个 R 包。它的一小部分功能是将数据保存到 xlsx 文件中。但是这个功能需要一个大而重的依赖:library(xlsx)。所以我想让这个依赖以某种方式成为可选和延迟加载。

它的最佳实践是什么?

我想我可以在需要它的函数代码中简单地library(xlsx),并处理此命令可能出现的故障。

【问题讨论】:

  • 函数内部使用,可以使用require
  • 如果你只需要一些功能你可以做xlsx:::the_function_you_need(...)
  • @holzbrn 我知道,但据我所知,我首先必须 require 那个图书馆。加载这个库需要几秒钟,而且我猜它需要很多资源(Java VM 等)
  • 我刚试过,你不需要require,但我认为这个包必须安装,所以如果你把你的包转发给其他用户可能会出现问题
  • @holzbrn 我自己也试过了,不幸的是,我需要的特定功能 xlsx::read.xlsx 除非我 require(xlsx) 才能工作。只有这样它才会加载它的依赖项:xlsxjarsrJava,我猜还会做很多其他的初始化工作。

标签: r package


【解决方案1】:

我认为最可靠的方法是将以下行添加到您的包的NAMESPACE

importFrom(xlsx, the_function_you_need)

随着

Depends: xlsx

DESCRIPTION 文件中。据我了解,这将使您的包可以访问您想要的功能,而无需加载整个库。这里有importFrom的一些讨论:What is the benefit of import in a namespace in R?

【讨论】:

  • 这是一个有趣的观点。我相信大部分等待时间是由于 Java VM 和朋友的初始化,我想无论我导入的 xlsx 库的一小部分是什么,这都是强制性的。但我会检查一下。
  • 您确定importFrom 功能仍受支持吗?我在我的 R 3.0.1 中找不到它
  • importFrom 不是函数。这是要添加到NAMESPACE 文本文件中的一行——它是您可能编写的任何包的一部分。 NAMESPACE 文件告诉包哪些“空格”(例如其他库)要查找哪些“名称”(例如函数)。但我的理解有些有限——我只知道它有效! (查看:stackoverflow.com/questions/4371181/namespaces-in-r-packages
  • 如果初始化发生在 xlsx 附加到搜索路径时(例如使用库或需要),这将节省时间,但如果它发生在加载包时(例如使用 pacakge 依赖)
  • @hadley 你介意澄清一下吗?如果描述中省略了Depends: PKGimportFrom(PKG, FUN) 会起作用吗?如果是这样,调用 FUN 的函数是否只能访问它运行 FUN 所需的位(例如,仅在 PKG 中加载必要的依赖项)?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-07-10
  • 2012-04-26
  • 2018-04-07
  • 1970-01-01
  • 1970-01-01
  • 2023-03-12
  • 1970-01-01
相关资源
最近更新 更多