2014-01-12 54 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

相關問題