我正在加载一些data.tables并希望在其中创建一些新列。
有一个closely related question on this topic,但它是在手动输入每个data.table的名称时预测的。这是我的例子:
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
评论
get
似乎不是问题的核心,因为add_vars(perf_attr, vars$perf_attr)
也失败了。
如果跳过保存/加载部分,它似乎工作正常,perf_attr
通过引用修改。如果我不使用函数,它也可以工作,如:
perf_attr[, names(vars$perf_attr) := lapply(vars$perf_attr, . %>% `[[`(2) %>% eval)]
我习惯于将内部selfref指针搞砸为已加载的data.tables,但我不确定如何修复它们以使其工作。我在lapply(mget(tables()$NAME), f)
行之后尝试了各种for (DTnm in tables()$NAME){stuff}
和load
黑客攻击,但效果不佳。
答案 0 :(得分:3)
好了,再看the linked answer,我想出了这个循环,在load
之后插入:
for (DTnm in tables()$NAME){
assign(DTnm, alloc.col(get(DTnm)))
}
当然,这会调整内存中的所有data.tables。