函数忽略我的if条件语句

时间:2016-09-01 18:09:07

标签: r recursion tree-traversal

我在数据框中概述了一棵树:

       number conc knot neg pick
           1    1    0   0    1
           2    1    0   0    1
           3    1    0   0    1
           4    3  164   0    1
           5    1    0   0    1
           6    1    0   0    1
           7    3  159   1    1
           8    0    0   0    0
           9    0    0   0    0
          10    3  208   1    1
          11    3  181   1    1
          12    3    1   1    1
          13    3   95   0    1
          14    0    0   0    0
          15    0    0   0    0

我用递归函数遍历树:

printtree <- function(number,tree) {
    if (!is.na(tree[number,5] != 0)) {
        letssee<-c(tree[number,1],tree[number,2],tree[number,3],tree[number,4],tree[number,5])  
        print(letssee) 
    } 
    left <- tree[number,1]
    if (!is.na(left)) printtree(tree[left,1]*2,tree)
    right <- tree[number,1]
    if (!is.na(right)) printtree(tree[right,1]*2+1,tree)
}

我的if条件应该在pick列= 0时省略行,但它仍在打印,我无法弄清楚原因。

这是输出:

[1] 1 1 0 0 1
[1] 2 1 0 0 1
[1]   4   3 164   0   1
[1] 8 0 0 0 0
[1] 9 0 0 0 0
[1] 5 1 0 0 1
[1]  10   3 208   1   1
[1]  11   3 181   1   1
[1] 3 1 0 0 1
[1] 6 1 0 0 1
[1] 12  3  1  1  1
[1] 13  3 95  0  1
[1]   7   3 159   1   1
[1] 14  0  0  0  0
[1] 15  0  0  0  0

因为is.na()而忽略了我的if语句吗?如果我没有进行is.na检查,我会收到错误,因为缺少值,其中需要TRUE / FALSE&#34;所以必须在那里。

1 个答案:

答案 0 :(得分:0)

如果树[number,5]恰好等于零,那么内部测试

tree[number, 5] !=0

将返回FALSE。 FALSE不是NA值,因此!is.na(FALSE)将始终返回TRUE。因此,如果tree [number,5]为零,那么你编写的if语句将始终返回TRUE。

也许试试:

if (!is.na(X) & X !=0) {...}