我有一个计算名为'MCI'的索引的函数。代码是
mci<-function(Data){
N<-dim(Data)[1]
L<-dim(Data)[2]
r <- rowSums(Data)
i.sc <- colSums(Data)
r.matrix <- matrix(r,N,1) %*% matrix(1,1,L)
p.cor.i <- (i.sc/N)
p.cor.i.matrix <- t(matrix(p.cor.i,L,N))
gutt <- r.matrix - t(matrix(1:L,L,N))
gutt<<- ifelse(gutt<0,0,1)
antigutt <- (L-r.matrix) - t(matrix(1:L,L,N))
antigutt<<- ifelse(antigutt<0,1,0)
Covgp<-diag(cov(t(gutt),t(p.cor.i.matrix)))
Covdp<-diag(cov(t(Data),t(p.cor.i.matrix)))
Covagp<-diag(cov(t(antigutt),t(p.cor.i.matrix)))
MCI <- (Covgp-Covdp)/(Covgp-Covagp)
return(MCI)
}
在这样的数据集上:
V1 V2 V3 V4 V5 V6
1 1 1 1 1 0 1
2 0 0 0 1 0 0
3 1 1 0 1 1 1
4 1 1 1 1 0 1
5 1 0 1 0 0 0
6 1 1 1 1 1 1
7 1 1 1 0 1 1
8 0 1 1 1 1 1
9 1 1 0 1 1 1
10 0 1 1 0 0 0
它返回:
[1] Inf Inf Inf Inf Inf Inf Inf Inf Inf Inf
但如果我独立计算函数的每个部分,结果将是:
[1] -Inf NaN NaN -Inf 0.3333333 NaN NaN NaN NaN 0.0000000
为什么会发生这种情况?如何在将来的编程中阻止这种情况?
答案 0 :(得分:1)
这些问题是:
gutt<<- ifelse(gutt<0,0,1)
antigutt<<- ifelse(antigutt<0,1,0)
您正在为封闭环境中的对象分配,而不是在函数环境中修改对象(具有相同名称)。当您在第一行中分配给gutt
时,它不会影响函数中的gutt
,之后您会使用几行。
将这两行改为:
gutt<- ifelse(gutt<0,0,1)
antigutt<- ifelse(antigutt<0,1,0)
并且该函数同意逐行运行代码。