Переопределение встроенной функции is.na

В продолжение моего предыдущего вопроса - NaN удаляется при использовании na.rm=TRUE, я ищу обходной путь с минимальными изменениями в моей (большой) кодовой базе.

Я пробовал это, это работает, но

my.is.na <- function(x)
{
   ifelse(is.na(x) & !is.nan(x), TRUE, FALSE)
}

Но я хочу переопределить встроенную функцию is.na. Переименование моей функции в is.na, очевидно, приводит к бесконечной рекурсии. Каковы мои варианты?

PS: во всем коде предполагается, что is.na(NaN) возвращает FALSE, поэтому я бы предпочел переопределить.


person Nishanth    schedule 16.04.2013    source источник
comment
Если вы пытаетесь заменить то, как na.rm работает в примитивных функциях, таких как max и min, может быть лучше переписать эти функции)   -  person mnel    schedule 16.04.2013
comment
Я только что прочитал ваш старый вопрос, и мне стало интересно, если вы хотите сохранить NaN в вызове max(), каков тогда максимум? Я бы согласился с @mnel и переписал maxfunction вместо запланированного здесь обходного пути.   -  person Daniel Fischer    schedule 16.04.2013
comment
@mnel - это, вероятно, более разумный вариант, поскольку я вижу множество потенциальных непредвиденных последствий от следующих ответов, подобных моему.   -  person thelatemail    schedule 16.04.2013
comment
@thelatemail, примитивные функции все равно не будут использовать is.na, поэтому, наряду с потенциальными непредвиденными последствиями, я не думаю, что какое-либо решение, изменяющее is.na, будет иметь предполагаемые последствия.   -  person mnel    schedule 16.04.2013
comment
@mnel - похоже, ты прав. Я проверил свой ответ на чувствительность, а не на специфичность. Думаю, это меня научит.   -  person thelatemail    schedule 16.04.2013
comment
@mnel Да, переопределение min и max - это одно из решений - я должен убедиться, что такое поведение требуется только для этих двух функций в моем коде.   -  person Nishanth    schedule 16.04.2013


Ответы (1)


Я не уверен, что это законный способ, но как насчет:

old.na <- is.na
is.na <- function(x)
{
   ifelse(old.na(x) & !is.nan(x), TRUE, FALSE)
}

Это может нарушать некоторые правила в R и может иметь другие плохие последствия, но, по крайней мере, оно ведет себя так, как вы задумали...

person Daniel Fischer    schedule 16.04.2013
comment
по-настоящему хакерский, ужасающе блестящим образом. я думаю, что это должно работать, однако, если is.na не вызывается больше нигде в любом другом контексте, потому что это общая функция и, вероятно, начнет плохо себя вести в этих случаях. но проблема с этими вещами в том, что вам, возможно, придется тестировать в производстве, а к тому времени уже слишком поздно... или нет? :[ - person daikonradish; 16.04.2013
comment
Это повлияет только на ваш код, а не на функции, вызывающие is.na из других пакетов. - person hadley; 16.04.2013