用户定义函数内外的结果不同,为什么?

时间:2014-01-12 03:35:21

标签: r function

我有一个计算名为'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 个答案:

答案 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)

并且该函数同意逐行运行代码。