如何在函数内更新data.table变量?

时间:2018-10-04 08:24:08

标签: r 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中的变量),所以我什至不知道是否去{{ 1}}对我来说太有意义了(即,到目前为止还没有data.tables分组操作)。我正在处理大型对象,想知道从by对象切换是否会加快速度(我可以使用data.frames使代码工作)。

谢谢

更新

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

adv.obj

您知道为什么函数会以这种方式失败吗?

0 个答案:

没有答案