对不起,如果重复的话。我是data.table
的新手。基本上,我可以使代码在函数外部运行,但是当我将操作打包到函数内部时,它们就会崩溃。最终,我希望将函数age.inds
和m.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
您知道为什么函数会以这种方式失败吗?