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 问题。
总结起来做法如下:
- 在函数所在的R包的脚本文件中添加
#' @import data.table
- 将
import(data.table)
语句添加到 NAMESPACE
文件
- 虽然我已经有
Imports: data.table
,但我在DESCRIPTION
文件中额外添加了Depends: data.table
- 然后我重建它并重新安装它
我在使用 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 问题。
总结起来做法如下:
- 在函数所在的R包的脚本文件中添加
#' @import data.table
- 将
import(data.table)
语句添加到NAMESPACE
文件 - 虽然我已经有
Imports: data.table
,但我在DESCRIPTION
文件中额外添加了Depends: data.table
- 然后我重建它并重新安装它