【发布时间】:2012-05-11 22:21:48
【问题描述】:
我一直认为在 'Depends' 字段中有一个包会自动导入 命名空间。但是,似乎在 R 2.15 中,依赖项直到包实际附加到搜索路径后才可用。这是预期的行为吗?
问题出现如下:假设有一个包'Child',它依赖,但没有显式导入一个名为'Parent'的包并包含一个函数调用“父”命名空间中的对象。那么当这个函数在没有实际附加'Child'的情况下被调用时,'Parent'中的函数就找不到了。
这里有一个来自bigdata 包手册的示例,但问题非常普遍:
x = matrix(rnorm(50*80),50,80)
beta = c(3,2,1.5,rep(0,77))
y = rnorm(50) + x%*%beta
z1 = bigdata::lasso.stars(x,y)
该示例失败,因为 lasso.stars 依赖于 'glmnet',直到附加 bigdata 才会加载。能够调用lasso.stars 的唯一方法是实际附加bigdata 包:
library(bigdata)
z1 = bigdata::lasso.stars(x,y)
现在让事情变得更复杂,似乎这个问题被继承到任何“孙子”包,在这种情况下导入 lasso.stars 函数。我很难找到一个很好的例子,但我相信他们就在那里。
这是一个错误吗?我知道可以通过要求包作者使用 Imports 而不是 Depends 来避免这种情况,但实际上 CRAN 上的大多数包仍然使用 Depends。如果 R 会自动将任何 Depends 包的名称空间导入到子包名称空间中,似乎很容易避免该问题。
【问题讨论】:
-
+1 好问题。这是我自己想过的,但推迟了,认为在 R-devel 上提出可能会更好(因为我认为 R-core 成员是唯一能解决这个问题的人)。他们肯定讨论过,但我快速搜索了几次,并没有看到任何提及,这似乎很奇怪......
-
@Jeroen,您能否提供示例?当我尝试
library(xts)时,会自动加载zoo的导出功能。 -
@kohske 示例在主题中。
xts包有一个 NAMESPACE 文件,它从zoo手动导入所需的函数。因此它不存在我认为的问题。 -
你说的是
random包吗?但我在random包中找不到bigdata的依赖项。 -
我想这不是一个错误。为什么不
library(bigdata)?有什么原因吗?