Data.table 内置包时聚合函数不起作用

Data.table aggregate function doesn't work when build in package

我在使用 data.table 包的聚合功能时遇到了一个非常奇怪的问题。当我在脚本文件中逐行 运行 它时,它工作得很好。另外当我把它放在那个脚本文件的函数中时。

但是当我想构建自己的 R 包并用 @export 标记相同的函数以使其可调用时,代码就会中断。当我在包中的另一个可调用函数中隐藏没有标签的函数时,它也会中断。

我可以给你一个小的示例数据集。但是记得要测试它,你必须开始一个新的 R package 项目并标记和构建函数。

就是这样:它只是在一个变量上建立一个总和。

# Example input data set df1
require(lubridate)
days = 365*2
date = seq(as.Date("2000-01-01"), length = days, by = "day")
year = year(date)
month = month(date)
x1 = cumsum(rnorm(days, 0.05)) 
df1 = data.frame(date, year, month, x1)

# Manual approach - called line by line. Works as expected
library(data.table)
df2 <- setDT(df1)[, lapply(.SD, mean), by=.(year, month), .SDcols = "x1"]
setDF(df2)
df2

# The aggregation function in the script file. 
testAggregationInScript <- function(df) {
  library(data.table)
  df2 <- setDT(df)[, lapply(.SD, mean), by=.(year, month), .SDcols = "x1"]
  setDF(df2)
  return(df2)
}

# Call the function of the script file. Works as expected
df3.script <- testAggregationInScript(df1)


# -----------------
# In the test R package build the test aggregation function

#' If the function is in a package and built and then called, it breaks
#' 
#' @export
testAggregationInPackage <- function(df) {
  library(data.table)
  df2 <- setDT(df)[, lapply(.SD, mean), by=.(year, month), .SDcols = "x1"]
  setDF(df2)
  return(df2)
}

# -----------------

# -----------------
# Back in the R script

# Call the function from the R package in an R script
# Here the code fails due to some strange error. Although everything seems the same
library(testRpackage)
df3.package <- testAggregationInPackage(df1)

控制台中的错误信息非常模糊:

Error in .subset(x, j) : invalid subscript type 'list'
Called from: `[.data.frame`(x, i, j)

我真的不明白。好像输入的不一样。也许 R 在传递参数时更改了包函数的输入格式或其他内容。或者这只是我这边的愚蠢^^

我测试了其他聚合函数,例如来自 dplyr 包,它们可以正常使用 data.table 包。但是我不能切换到另一种方法,我必须使用 data.table 包。

所以我需要你们的帮助。提前致谢,请随时提问或发表评论。

devtools 包似乎仍然存在问题。你可以阅读 here. What gave me a good hint was this 之前的 Whosebug 问题。

总结起来做法如下:

  1. 在函数所在的R包的脚本文件中添加#' @import data.table
  2. import(data.table) 语句添加到 NAMESPACE 文件
  3. 虽然我已经有Imports: data.table,但我在DESCRIPTION文件中额外添加了Depends: data.table
  4. 然后我重建它并重新安装它