SD在作为R包的一部分的函数中的行为与在它们直接来源时的行为不同

lymnna71  于 2023-05-11  发布在  其他
关注(0)|答案(1)|浏览(109)

我观察到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下进行了尝试。
  • 它不依赖于名为dtbycols的函数参数。重命名它们不会改变行为。
  • 它不取决于data.table是在运行devtools::load_all之前还是之后加载的,也不取决于example-package是在安装之后还是之前加载的。在示例包的DESCRIPTION文件中包含data.table作为导入也不会影响行为。
  • 更奇怪的是:上面的函数在缺少bycols时不会返回错误,您只需运行min_ex(dt)即可。在这种情况下,它的行为就像bycols包含数据表中的所有列名一样。我不明白为什么会出现这种情况,并期望它返回一个错误,因为缺少一个没有默认值的参数。
stszievb

stszievb1#

正如@r2evans所指出的,在包代码中包含.datatable.aware <- TRUE可以解决这个问题。
使用Depends将data.table作为dependency放入DESCRIPTION文件中也足够了,以前我只尝试过Imports。

相关问题