首页 > 解决方案 > 如何更新函数中的 data.table 变量?

问题描述

抱歉,如果这是重复的。我很陌生data.table。基本上,我可以让我的代码在函数之外工作,但是当我将操作打包到函数内部时,它们就会崩溃。最终,我希望将函数age.indsm.inds内部函数放在一个包中。

# required functions ------------------------------------------------------

# create object
create.obj <- function(n = 100){
  obj = list()
  obj$inds <- data.table(age = rep(0.1, n), m = NA)
  obj$m$model <- function(age, a){return(age^a)}
  obj$m$params <- list(a = 2)
  return(obj)
}

# calculate new 'age' of inds
age.inds <- function(obj){
  obj$inds[, age := age + 1]
  return(obj)
}

# calculate new 'm' of inds
m.inds <- function(obj){
  ARGS <- list()
  args.incl <- which(names(obj$m$params) %in% names(formals(obj$m$model)))
  ARGS <- c(ARGS, obj$m$params[args.incl])
  args.incl <- names(obj$inds)[names(obj$inds) %in% names(formals(obj$m$model))]
  ARGS <- c(ARGS, obj$inds[, ..args.incl]) # double dot '..' version
  # ARGS <- c(ARGS, inds[, args.incl, with = FALSE]) # 'with' version

  obj$inds[, m := do.call(obj$m$model, ARGS)]
  return(obj)
}

# advance object
adv.obj <- function(obj, times = 1){
  for(i in seq(times)){
    obj <- age.inds(obj)
    obj <- m.inds(obj)
  }
  return(obj)
}



# Example  ----------------------------------------------------------------
# this doesn't work
obj <- create.obj(n = 10)
obj # so far so good
obj <- age.inds(obj)
obj # 'inds' gone

# would ultimately like to call adv.obj
obj <- adv.obj(obj, times = 5)

另外(作为旁注),我想在我的代码中做的大部分事情都是矢量化计算(即更新 中的变量obj$inds),所以我什至不知道这data.tables对我来说是否有意义(即没有by分组操作至今)。我正在处理大型对象,想知道从data.frame对象切换是否会加快速度(我可以使用 data.frames 让我的代码工作)。

谢谢

更新

好的,感谢@eddi,打印问题已经解决。但是,当这些“inds”函数位于包内部(即未导出)时,我无法使用它们。我做了一个小包(DTtester),在帮助文件中有这个例子adv.obj

obj <- create.obj(n=10)
obj <- adv.obj(obj, times = 5)
# Error in `:=`(age, new.age) : 
# Check that is.data.table(DT) == TRUE. Otherwise, := and `:=`(...) are 
# defined for use in j, once only and in particular ways. See help(":=").

知道为什么这些功能会以这种方式失败吗?

标签: rdata.table

解决方案


推荐阅读