我在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?
答案 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
。在这种情况下,列扩展名不会被应用。我猜这是因为对象仍以某种方式引用包数据,这可以防止在执行函数时应用任何更改。