2013-04-16 3 views
1

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

Я попытался это, который работает, но

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

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

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

+2

Если вы пытаетесь заменить так, как 'na.rm' работает в примитивных функциях, таких как' max' и 'min', возможно, лучше переписать эти функции) – mnel

+0

Я просто прочитал ваш старый вопрос и я подумал: если вы хотите сохранить 'NaN' в вызове' max() ', то какой максимум? Я бы согласился с @mnel и переписал функцию 'max', а не планируемое обходное решение. –

+1

@mnel - это, вероятно, более разумный вариант, поскольку я вижу много потенциальных непредвиденных последствий из следующих ответов, таких как мои. – thelatemail

ответ

0

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

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

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

+0

действительно взломанный, ужасающе блестящий путь. я думаю, что он должен работать, хотя, если 'is.na' не вызывается нигде в любом другом контексте, потому что это общая функция и, вероятно, начнет плохо себя вести в этих случаях. но дело в том, что вам, возможно, придется протестировать на производстве, и к тому времени уже слишком поздно ... или это так? : [ – daikonradish

+0

Я голосую за это отправлено на thedailywtf :-) –

+0

Это повлияет только на ваш код, а не на любые функции, которые вызывают 'is.na' из других пакетов. – hadley

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