我有一个很大的矩阵(9600x9600,703.6 Mb),不断变化。创建时它看起来很好,但在用于计算之后,除了几列之外的所有值都被0替换。由于我无法调试问题,这让我有点疯狂。有没有办法追踪变量的变化?像更改或访问日志?或者有没有办法锁定变量,以便不能修改它?
非常感谢任何帮助。
编辑:
似乎矩阵" L"在应用此等式后,即使已经锁定了' lockBinding后,也会对其进行修改:
F.calc.E = function(M,p){
M$V1 <- paste(M$V1,M$V2,sep = ", ")
p.loc = grep(pattern = p,x = M$V1) # loc of target pressure
p.vector = as.numeric(M[p.loc,4:ncol(M),with=FALSE])
pL = mmult(L,p.vector)
return(pL)
}
mmult函数的代码就是这个,通过另一个SO帖子获得:
func <- 'NumericMatrix mmult( NumericMatrix m , NumericVector v , bool byrow = true ){
if( byrow );
if( ! m.nrow() == v.size() ) stop("Non-conformable arrays") ;
if( ! byrow );
if( ! m.ncol() == v.size() ) stop("Non-conformable arrays") ;
NumericMatrix out(m) ;
if( byrow ){
for (int j = 0; j < m.ncol(); j++) {
for (int i = 0; i < m.nrow(); i++) {
out(i,j) = m(i,j) * v[j];
}
}
}
if( ! byrow ){
for (int i = 0; i < m.nrow(); i++) {
for (int j = 0; j < m.ncol(); j++) {
out(i,j) = m(i,j) * v[i];
}
}
}
return out ;
}'
我仍然无法调试。
答案 0 :(得分:2)
您可以使用lockBinding
:
m <- matrix(1:4, 2)
evil.fun <- function(x) .GlobalEnv[[x]][2,2] <- 0
evil.fun("m")
m
# [,1] [,2]
#[1,] 1 3
#[2,] 2 0
m <- matrix(1:4, 2)
lockBinding("m", .GlobalEnv)
evil.fun("m")
#Error in .GlobalEnv[[x]][2, 2] <- 0 :
# cannot change value of locked binding for 'm'
unlockBinding("m", .GlobalEnv)