2013-09-25 2 views
10

У меня была ошибка в моем коде, вызванная непреднамеренным сопоставлением символьной переменной с числовой переменной (оба они должны были быть числовыми). Эта ошибка была бы намного легче найти, если бы у R было предупреждение при выполнении такого типа сравнения. Например, почему это не бросайте предупреждениеПочему сравнение между числовыми и символьными переменными не дает предупреждения?

> 'two' < 5 
[1] FALSE 

но это бросить предупреждение

> as.numeric('two') < 5 
[1] NA 
Warning message: 
NAs introduced by coercion 

Это не для меня ясно, что происходит за кулисами, в первом сравнении?

+4

предупреждение не исходит из сравнения, а из 'as.numeric' –

+3

Ответ в том, что это R (разработан, чтобы быть в основном совместимы с S), а не C, Java, или любой другой язык вы ожидали, что это произойдет. Существует довольно много принуждений типов, которые происходят, а не только с операторами сравнения. Это не строго типизированный язык. –

+0

@ Dwin Я понимаю, что R делает все возможное, чтобы понять мой код, но с чем-то столь же бессмысленным, как «два» <5, я просто надеялся, что R предупредит меня. Хотелось бы, чтобы появилась опция, которая могла бы быть включена, что приведет к выходу предупреждения на экран для этого типа вещей (например, gcc -Wall). – fxrhvk

ответ

19

В вашем примере 5 преобразуется в символ, поэтому тест такой же, как и 'two' < as.character(5).

От ?Comparison:

Если два аргумента атомные векторы различных типов, один принуждают к типу с другой стороны, (уменьшение) порядок приоритета будучи характер, сложный, числовой, целочисленный, логический и необработанный.

+0

Спасибо! Мне было трудно найти документацию по этой теме. – fxrhvk

+5

Для документации по функциям, которые содержат не буквенно-цифровые символы, заключите их в обратные элементы '? \' <\ '' Или используйте функцию справки с кавычками: 'help (" <")'. –

+2

@ RicardoSaporta или использовать '?" <"' – hadley

Смежные вопросы