2017-06-20 13 views
0

私が書いているRパッケージには非常に大きなテーブルがあります。ディストリビューションのためにサイズを小さくするために、私は他のカラムから計算できるテーブルからすべてのカラムを削除しています。たとえば、曜日は日付から計算できるので、パッケージデータセットから曜日を除外します。ただし、これらの列を標準的な方法で再計算すると便利です。効率を上げるために、私はdata.tableで割り当てを行いたいと思います。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

このアプローチはdata.tableで動作します。私は手動で作成します。それがあなたにも役立つことを確認してください。また、 'dataset'を使って作成されたdata.tableだけではできません。 PS:関数内に 'your_data_table [...]する必要があります。 – Roland

+0

/datasetはどのように定義されていますか? – Roland

+0

また、基底Rに 'weekdays'関数があります。これは' weekdays(as.Date( "2010-01-01")) 'です。 – lmo

答えて

0

私はそれを理解しました。私は上に掲載例作業を行いますが、あなたがそうのように、関数に供給する前にdata.tabledata.table::copyを作る場合にのみ:

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) 

間違い私の例では、私はパッケージを割り当てたことがありますcopyを作成せずに直接dt = myPackageDataにデータを転送します。その場合、列の拡張は適用されません。これは、オブジェクトが何らかの形でパッケージデータを参照しているために、関数が実行されたときに変更が適用されないためです。

関連する問題