2016-05-26 4 views
2

いくつかのdata.tablesをロードしていて、いくつかの新しい列を作成したいとします。関数によって変更されたdata.tableを作成する

closely related question on this topicがありますが、手動で各data.tableの名前を入力することを前提としています。 getadd_vars(perf_attr, vars$perf_attr)も失敗したことから、問題の中心ではないようで

library(data.table) 
library(magrittr) 

perf_attr = data.table(
    ID   = 1:2, 
    perf_date = as.IDate("2015-12-18") + 0:1, 
    metro_pop = 1e4*(1:2) 
) 

##### this part causes trouble ###### 
save(perf_attr, file = "tmp.rdata") 
rm(perf_attr) 
load("tmp.rdata") 

add_vars = function(DT = data.table(), vars = list()){ 
    if (length(vars)) DT[, names(vars) := lapply(vars, . %>% `[[`(2) %>% eval)][] 
    DT 
} 

vars = list(
    perf_attr = list( 
     const   = ~1, 
     lpop   = ~log(metro_pop), 
     dum_weekend  = ~weekdays(perf_date) %in% c("Friday", "Saturday") 
    ) 
) 

for (DTnm in names(vars)) add_vars(get(DTnm), vars[[DTnm]]) 

##### new columns should appear here, but don't ###### 
perf_attr 
# ID perf_date metro_pop medinc 
# 1: 1 2015-12-18  10000 30000 
# 2: 2 2015-12-19  20000 40000 

コメント

  1. :ここに私の例です。

  2. セーブ/ロード部分をスキップすると、参考のためにperf_attrが変更されて正常に動作しているようです。

    perf_attr[, names(vars$perf_attr) := lapply(vars$perf_attr, . %>% `[[`(2) %>% eval)] 
    
  3. 私は内部SELFREFポインタがロードされたdata.tablesのために台無しに持つことに慣れているが、これを作るためにそれらを修復する方法がわからないです:私はのように、機能を使用しない場合にも動作します作業。私はload行の後に様々なlapply(mget(tables()$NAME), f)for (DTnm in tables()$NAME){stuff}ハックを試みましたが、良い効果はありません。

+0

リンクされた質問にちょうど遭遇し、それを再読しています。私はこのような答えを見つけたらこの質問を削除するかもしれません。 – Frank

+0

さて、問題を解決しました。 https://github.com/Rdatatable/data.table/issues/1017が修正されたときに、私が削除する必要があるのか​​、それをクローズするのか、それとも変更しないままにするのかはわかりません。 – Frank

答えて

3

まあ、the linked answerで再び見て、私はload後に挿入するには、このループを思い付いた:

もちろん
for (DTnm in tables()$NAME){ 
    assign(DTnm, alloc.col(get(DTnm))) 
} 

が、これはメモリ内のすべてのdata.tablesを微調整します。

関連する問題