2016-09-01 2 views
0

У меня есть дерево, изложенное в кадре данных, как:Функция игнорирование моего, если оператор условия

 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) 
} 

Моим, если условие должно быть опуская линии, когда столбец 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()? Если у меня нет проверки is.na, я получаю сообщение об ошибке «Недопустимое значение, в котором требуется TRUE/FALSE», поэтому он должен быть там.

+0

структуры данных дерева доступны в пакете data.tree и через Rcpp. Вы изобретаете это колесо в пределах рамки data.frame? – Frank

+0

Я так не думаю - кадр данных упорядочен по-другому, чем то, что мне нужно. Поэтому я переупорядочиваю его таким образом, который полезен для моих целей. Я могу сохранить новую структуру в кадре данных и опустить эти строки, но это кажется неэффективным. Мне интересно, почему условие проигнорировано в выходе. – Jason

+0

'! Is.na (tree [number, 5]! = 0)' никогда не будет 'FALSE', так как' pick' никогда не 'FALSE' .. Почему вы ищете' NA 'там? Замените на 'tree [number, 5]! = 0'. – Axeman

ответ

0

Если дерево [число, 5] бывает действительно равна нулю, то внутренний тест

tree[number, 5] !=0 

Вернет FALSE. FALSE не является значением NA, поэтому! Is.na (FALSE) всегда возвращает TRUE. Таким образом, оператор if, как вы его написали, всегда будет возвращать TRUE, если дерево [число, 5] равно нулю.

Может попробовать:

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

Спасибо, Габриэль, это не сработало, но я был в состоянии следующий, если оператор if (! Is.na (дерево [число, 5]! = 0)) { если (дерево [число, 5]! = 0) , и теперь он работает, но похоже, что я должен быть в состоянии сделать это в одном заявлении, как ваше предложение. – Jason

+0

Хм, да, я подозреваю, что должен быть способ. Потенциально попробуйте использовать && вместо &? && делает более ленивую оценку слева направо и немедленно прекращается, если X является NA. Я думаю, что проблема с версией, которую я написал, заключается в том, что NA! = 0 оценивает NA и (TRUE & NA) оценивает значение NA, которое вызовет ошибку. – gfgm