当包A通过具有Depends: data.table
指令的另一个包B传递依赖data.table时,包A中无法识别data.table的方法。这似乎 - 至少表面上 - 与...不同其他包裹。
示例:一个包pkgB具有以下内容,它直接在Depends
指令中表示对data.table和zoo的依赖(nb没有理由选择zoo,它只是用作我期望的行为的一个例子) :
描述
Package: pkgB
Version: 0.1
Depends: data.table, zoo
RoxygenNote: 6.0.1
功能
f11 <- function() {
print(is.data.table(data.table(x)))
print(data.table(X=x)$X)
print(data.table(X=x)[,.(X)])
}
f12 <- function() {
print(index(zoo(x)))
}
f11()
和f12()
的输出(为简洁起见未显示)与预期一致,即动态数据库的data.table和.
的方法index
已被识别,且没有错误结果。
第二个包pkgA具有以下内容,通过依赖pkgb间接表示对data.table和zoo的依赖:
描述
Package: pkgA
Version: 0.1
Depends: pkgB
RoxygenNote: 6.0.1
功能
#' @export
f21 <- function() {
print(is.data.table(data.table(x)))
print(data.table(X=x)$X)
print(data.table(X=x)[,.(X)])
}
#' @export
f22 <- function() {
print(index(zoo(x)))
}
现在以下是一个简短脚本的控制台会话,它显示f21生成错误,因为在f21中无法识别data.table函数.
,而在f22中,动物园函数index
是公认的。 search()显示路径上的两个包,并且在f21中识别函数data.table
,与函数.
不同。
> x <- 1:2
> f21()[]
[1] TRUE
[1] 1 2
Error in .(X) : could not find function "."
> f21
function() {
print(is.data.table(data.table(x)))
print(data.table(X=x)$X)
print(data.table(X=x)[,.(X)])
}
<environment: namespace:pkgA>
>
> f22()
[1] 1 2
> f22
function() {
print(index(zoo(x)))
}
<environment: namespace:pkgA>
> search()
[1] ".GlobalEnv" "package:pkgA" "package:pkgB"
[4] "package:zoo" "package:data.table" "package:stats"
[7] "package:graphics" "package:grDevices" "package:utils"
[10] "package:datasets" "package:methods" "Autoloads"
[13] "package:base"
>
> devtools::session_info()
Session info ------------------------------------------------------------------
setting value
version R version 3.4.3 (2017-11-30)
system x86_64, mingw32
ui Rgui
language (EN)
collate English_United Kingdom.1252
tz Europe/London
date 2018-03-18
Packages ----------------------------------------------------------------------
package * version date source
base * 3.4.3 2017-12-06 local
compiler 3.4.3 2017-12-06 local
data.table * 1.10.4-3 2017-10-27 CRAN (R 3.4.3)
datasets * 3.4.3 2017-12-06 local
devtools 1.13.5 2018-02-18 CRAN (R 3.4.3)
digest 0.6.15 2018-01-28 CRAN (R 3.4.3)
graphics * 3.4.3 2017-12-06 local
grDevices * 3.4.3 2017-12-06 local
grid 3.4.3 2017-12-06 local
lattice 0.20-35 2017-03-25 CRAN (R 3.4.3)
memoise 1.1.0 2017-04-21 CRAN (R 3.4.3)
methods * 3.4.3 2017-12-06 local
pkgA * 0.1 2018-03-18 local
pkgB * 0.1 2018-03-18 local
stats * 3.4.3 2017-12-06 local
utils * 3.4.3 2017-12-06 local
withr 2.1.1 2017-12-19 CRAN (R 3.4.3)
zoo * 1.8-1 2018-01-08 CRAN (R 3.4.3)
>
这是正确的行为吗?我当然可能无法理解这些传递依赖性是如何处理的,或者可能是zoo::index
和data.table::.
的不同状态,但乍一看它们表现不同的是动态方法是通过传递依赖加载的,而data.table方法不是。
在此示例中使用zoo
包没有什么特别之处,它仅提供有关data.table
的问题的上下文。
此示例中的函数.
没有什么特别之处,例如:=
也是如此。
在我在全局环境中引用变量x的函数中。我认为这通常是一种弃用的风格,但对于大型data.table对象,我认为是正常的。
我非常依赖传递依赖,到目前为止它已经按预期工作,避免重复等。我应该养成这种习惯吗?
这是从更复杂的应用程序派生的最小示例。它仍然很长,而且我不确定是否有一个要点或某些东西会使这个问题更有用或易于理解 - 指导意见。