使用函数修改加载的data.table

时间:2016-05-26 18:54:29

标签: r data.table

我正在加载一些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

评论

  1. get似乎不是问题的核心,因为add_vars(perf_attr, vars$perf_attr)也失败了。

  2. 如果跳过保存/加载部分,它似乎工作正常,perf_attr通过引用修改。如果我不使用函数,它也可以工作,如:

    perf_attr[, names(vars$perf_attr) := lapply(vars$perf_attr, . %>% `[[`(2) %>% eval)]
    
  3. 我习惯于将内部selfref指针搞砸为已加载的data.tables,但我不确定如何修复它们以使其工作。我在lapply(mget(tables()$NAME), f)行之后尝试了各种for (DTnm in tables()$NAME){stuff}load黑客攻击,但效果不佳。

1 个答案:

答案 0 :(得分:3)

好了,再看the linked answer,我想出了这个循环,在load之后插入:

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

当然,这会调整内存中的所有data.tables。