いくつかのdata.tablesをロードしていて、いくつかの新しい列を作成したいとします。関数によって変更されたdata.tableを作成する
closely related question on this topicがありますが、手動で各data.tableの名前を入力することを前提としています。 get
はadd_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
コメント
:ここに私の例です。
セーブ/ロード部分をスキップすると、参考のために
perf_attr
が変更されて正常に動作しているようです。perf_attr[, names(vars$perf_attr) := lapply(vars$perf_attr, . %>% `[[`(2) %>% eval)]
私は内部SELFREFポインタがロードされたdata.tablesのために台無しに持つことに慣れているが、これを作るためにそれらを修復する方法がわからないです:私はのように、機能を使用しない場合にも動作します作業。私は
load
行の後に様々なlapply(mget(tables()$NAME), f)
とfor (DTnm in tables()$NAME){stuff}
ハックを試みましたが、良い効果はありません。
リンクされた質問にちょうど遭遇し、それを再読しています。私はこのような答えを見つけたらこの質問を削除するかもしれません。 – Frank
さて、問題を解決しました。 https://github.com/Rdatatable/data.table/issues/1017が修正されたときに、私が削除する必要があるのか、それをクローズするのか、それとも変更しないままにするのかはわかりません。 – Frank