我有一个模型对象描述为矢量和矩阵参数的命名列表 . 这类对象的两个基本操作是基于每个参数向量或矩阵的元素与向量中的索引之间的 mapping 来加载和存储数字向量 . 这是一个简化的例子:
LoadModelFromVector <- function(vecParams) {
model <- list(
A = diag(5), # a diagonal square matrix
B = matrix(0, 5, 5) # un upper triangular square matrix
)
attr(model, "p") <- 15
diag(model$A) <- vecParams[1:5]
model$B[upper.tri[model$B]] <- vecParams[5 + (1:(5*(5-1)/2)))]
model
}
StoreModelToVector <- function(model) {
vecParams <- double(length = attr(model, "p"))
vecParams[1:5] <- diag(model$A)
vecParams[5 + (1:(5*(5-1)/2)))] <- model$B[upper.tri[model$B]]
vecParams
}
我不喜欢上面的例子,因为它在代码中的两个位置复制了映射 . 相反,我想在一个地方进行这种映射 . 我认为这可以使用赋值运算符 <-
的抽象来优雅地完成:
LoadStoreModel <- function(vecParams, model = NULL) {
if(is.null(model)) {
model <- list(
A = diag(5), # a diagonal square matrix
B = matrix(0, 5, 5) # un upper triangular square matrix
)
`%op%` <- `<-` # WORKS FINE :-)
mode <- "load"
} else {
vecParams <- double(length = attr(model, "p"))
`%op%` <- `->` # GENERATES "Error: object '->' not found" :-(
mode <- "store"
}
diag(model$A) %op% vecParams[1:5]
model$B[upper.tri[model$B]] %op% vecParams[5 + (1:(5*(5-1)/2)))]
if(mode == "load") {
model
} else {
vecParams
}
}
LoadModelFromVector(vecParams) {LoadStoreModel(vecParams)}
StoreModelToVector(model) {LoadStoreModel(NULL, model)}
上面的代码生成错误"Error: object '->' not found" . 两个运算符'->'和'<-'都记录在包基础的R帮助页面 ?assignOps
中 .
2 回答
控制台中的
<-
返回另外,如果我们查看
base
包的所有函数并尝试搜索<-
和->
这返回
base
包中没有- >
函数希望这可以帮助 .
我的示例的以下修改似乎工作正常(还修复了一些语法拼写错误):
我也尝试过该行的其他变种被评为“密钥更改” . 这些不起作用: