Есть ли способ отключить авто приведение в R при сравнении разных типов - PullRequest
0 голосов
/ 07 октября 2019

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

Вот как R сравнивает две переменные с разными типами:

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

Например,

'95'>90 
#[1] TRUE
'100'>90
#[1] FALSE

1 Ответ

1 голос
/ 08 октября 2019

В принципе, можно переписать каждый базовый оператор в R. Но сделать это настолько опасно, что я бы не советовал ни в коем случае.

Что вы должны сделать, это проверить тип ваших аргументов перед сравнением. Например, у вас есть такая функция:

f <- function(arg1, arg2, ...) {
   #here you do some stuff
   x <- something(arg1)
   y <- someotherthing(arg1, arg2)
   #here you are about to do the comparison
   #but you check the arguments beforehand
   if (typeof(x)!=typeof(y)) stop("Type mismatch")
   #if there isn't any error you continue
   z <- x > y
   ...
   return(somevalue)
}

А как насчет опасного способа переопределения базового оператора? Вот оно:

`>`<-function(e1, e2) {
    if (typeof(e1)!=typeof(e2) && (!is.numeric(e1) || !is.numeric(e2)) ) stop("Type mismatch")
    basegt<-get(">",baseenv())
    basegt(e1,e2)
}
'95'>90 
#Error in "95" > 90 : Type mismatch
95>90
#[1] TRUE

Но, опять же, не пытайтесь делать это дома (и ни на работе в еще большей степени).

...