2016-05-30 2 views
1

Я знаю синтаксис с IF заявления в R:Почему синтаксис `intersect` не работает в R в` if statement`?

if (1==1){ 
    print("this is true") 
} 

И я знаю, что материал между () должен быть оценен на логический. Так что, когда я пытаюсь это:

if (intersect(list(1),list(1,2)) != list()){ 
    print("this is also true") 
} 

Я ожидал, что это работает, так как intersect(list(1),list(1,2)) != list() оценивается как логический тип:

intersect(list(1),list(1,2)) == list() 

я делаю что-то явно не так? Благодарю.

+1

Логический вектор должен иметь длину 1, что не так. Вы можете проверить длину (пересечь (список (1), список (1,2)))> 0'. – Roland

+0

Логический * тип *, да, но нулевая длина. Это выражение должно оцениваться как «TRUE», так и «FALSE». –

+1

Вы не спрашиваете в этом случае, если длина пересечения равна нулю (как в 'length (intersect (list (1), list (1,2))) == 0')? При сравнении списков он не отображается, он поддерживается, как в 'list (1,2) == list (1,2)' дает ошибку 'Ошибка в списке (1, 2) == list (1, 2): сравнение этих типов не реализовано. – steveb

ответ

2

Логические операторы не подходят для сравнения объектов списка. Объекты списка являются рекурсивными типами, не допускающими логических векторов без потери структурной информации. Функция сравнения списков - identical. Это не представляется разумным ожидать, что ваша работа, чтобы доставить TRUE, так как пересечение list(1) и list(1,2) не будет list(), так что я перевернутой тест, чтобы тестирование:

if (!identical(intersect(list(1),list(1,2)), list())) { 
      print("this is also true") 
     } 
#[1] "this is also true" 

И пересечение list(1):

if (identical(intersect(list(1),list(1,2)), list(1))) { 
    print("this is also true") 
} 
#[1] "this is also true" 
Смежные вопросы