我观察到data.tables .SD-notation的以下奇怪行为。考虑函数
min_ex = function(dt,bycols)
{
dt_sub = dt[, .SD, .SDcols = bycols]
print(dt_sub)
}
这个函数应该接受一个数据表dt
和一个dt
列名的字符向量,并打印出这些列。当函数作为脚本的一部分编译或作为独立文件源时,它完全按预期工作:
library(data.table)
min_ex = function(dt,bycols)
{
dt_sub = dt[, .SD, .SDcols = bycols]
print(dt_sub)
}
dt = data.table(x = rep(1,3),y = 1:3)
min_ex(dt,'x')
这将打印dt中的x列。然而,当这个函数包含在R包中时,它的行为就不同了。具体来说,当我的工作目录设置为包目录,并且./R文件夹中有一个包含此函数的文件,我运行
rm(list = ls())
devtools::load_all()
library(data.table)
dt = data.table(x = rep(1,3),y = 1:3)
min_ex(dt,'x')
它会打印出“Null data.table(0 rows and 0 cols)”。我在github上放了一个最小的示例包。这可以直接从github安装,然后函数总是打印出Null数据表。
我想知道为什么这个函数在作为包的一部分时会有不同的行为,以及我如何才能让这个函数按预期的方式工作。
到目前为止我所尝试的:
- 我是使用
devtools::load_all
还是安装这个包都没有关系。该函数的行为相同(打印Null数据表)。如果你使用devtools::install_github
直接从上面的github repo链接安装,它的行为也是一样的。 - 我使用了R4.2.2和data.table 1.14.8,并在Linux和Windows下进行了尝试。
- 它不依赖于名为
dt
和bycols
的函数参数。重命名它们不会改变行为。 - 它不取决于
data.table
是在运行devtools::load_all
之前还是之后加载的,也不取决于example-package是在安装之后还是之前加载的。在示例包的DESCRIPTION文件中包含data.table
作为导入也不会影响行为。 - 更奇怪的是:上面的函数在缺少
bycols
时不会返回错误,您只需运行min_ex(dt)
即可。在这种情况下,它的行为就像bycols包含数据表中的所有列名一样。我不明白为什么会出现这种情况,并期望它返回一个错误,因为缺少一个没有默认值的参数。
1条答案
按热度按时间stszievb1#
正如@r2evans所指出的,在包代码中包含
.datatable.aware <- TRUE
可以解决这个问题。使用Depends将data.table作为dependency放入DESCRIPTION文件中也足够了,以前我只尝试过Imports。