data.table列分配作为存储函数

时间:2017-06-20 06:30:01

标签: r data.table

我在R包中有一个表,我写的非常大。为了保持大小以便分发,我将从表中删除可以从其他列计算的所有列。例如,可以从日期计算星期几,因此我从包数据集中省略星期几。但是,我希望为使用该软件包的任何人以标准方式重新计算这些列。为了提高效率,我想用data.table就地分配来完成它。我想象的是这样的事情:

dt = myPackageData  # minimal data set included in the package
extend_dow = function(your_data_table) {
  your_data_table[,`:=`(day_of_week = lubridate::wday(my_date))]
}
extend_dow(dt)

然后dt可以使用day_of_week列。

我遇到的问题是新列的就地分配似乎发生在较低级别的环境中,而我传递给该函数的data.table实际上并没有被修改。

有谁知道如何存储新列的完整公式,可以使用单个函数调用应用于用户传递给函数的相同data.table?

1 个答案:

答案 0 :(得分:0)

我明白了。我在上面发布的示例可以正常工作,但前提是您在将data.table::copy data.table提供给函数之前,如下所示:

library(myPackage)
library(data.table)
dt = copy(myPackageData)
extend.weekday = function(your_data_table) {
  your_data_table[,`:=`(day_of_week = lubridate::wday(my_date))]
}
extend.weekday(dt)

我的示例中的错误是我将包数据直接分配给dt = myPackageData,而没有生成copy。在这种情况下,列扩展名不会被应用。我猜这是因为对象仍以某种方式引用包数据,这可以防止在执行函数时应用任何更改。