【发布时间】:2018-08-15 05:43:33
【问题描述】:
我有一个模型对象,描述为向量和矩阵参数的命名列表。此类对象的两个基本操作是基于每个参数向量或矩阵的元素与向量中的索引之间的映射,从/向数字向量加载和存储。这是一个简化的例子:
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)}
上面的代码生成错误“错误:找不到对象'->'”。 '->' 和 '?assignOps 中。
【问题讨论】:
-
@clemens:感谢您的提示。您建议的帖子讨论了一个略有不同的问题,但其中一个答案指向 stackoverflow.com/questions/34599027/… 。这一个清楚地回答了我的问题。
标签: r