r - 如何更新函数中的 data.table 变量?
问题描述
抱歉,如果这是重复的。我很陌生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
),所以我什至不知道这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(":=").
知道为什么这些功能会以这种方式失败吗?
解决方案
推荐阅读
- swift - Swift SpriteKit 速度单位是点而不是米?
- reactjs - 在 Redux-Saga 中处理多个依赖请求 - 处理错误
- sql - 有没有其他方法可以合并来自 2 个不同表的 2 列,如图所示。我希望是否可以使用 unpivot
- node.js - 在快速发布请求期间通过 WebSocket 向客户端发送消息
- java - super.replace() 有什么作用?
- python - 更快的应用卡在计时阶段
- cmake - MSBuild.exe 的 cmake 问题
- javascript - javascript sharedArrayBuffer 和按位运算返回 32 位而不是 16 位数字
- ios - Texbox 区域在 Safari 和 iPhone 网络浏览器中不可见
- chef-infra - 使用自定义 ohai 插件的运行列表中的食谱顺序