2014-01-12 29 views
0

我有一个计算索引'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 

为什么发生这种情况,我如何在将来的编程中阻止这种情况?

回答

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) 

和功能与运行代码行由行一致。

+0

Thanks.It解决了这个问题。它是全局变量还是局部变量? – Amin

+0

是的。你已经创建了局部变量,这些变量默认使用这些名称('gutt'和'antigutt')。但'<< - '赋值修改了一个不同的环境,因此是一个不同的变量。 –

+0

我明白了。所以在将来的使用中,我应该避免使用'<< - '对吗?我是根据一个建议做到的。 – Amin

相关问题