一个包不应该依赖于transitive Depends:data.table方法的指令吗?

时间:2018-03-18 10:45:55

标签: r data.table

当包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::indexdata.table::.的不同状态,但乍一看它们表现不同的是动态方法是通过传递依赖加载的,而data.table方法不是。

在此示例中使用zoo包没有什么特别之处,它仅提供有关data.table的问题的上下文。

此示例中的函数.没有什么特别之处,例如:=也是如此。

在我在全局环境中引用变量x的函数中。我认为这通常是一种弃用的风格,但对于大型data.table对象,我认为是正常的。

我非常依赖传递依赖,到目前为止它已经按预期工作,避免重复等。我应该养成这种习惯吗?

这是从更复杂的应用程序派生的最小示例。它仍然很长,而且我不确定是否有一个要点或某些东西会使这个问题更有用或易于理解 - 指导意见。

0 个答案:

没有答案