【问题标题】:Overriding in-built is.na function覆盖内置 is.na 函数
【发布时间】:2013-04-08 11:06:02
【问题描述】:

作为我之前的问题 - NaN is removed when using 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,所以我更愿意覆盖。

【问题讨论】:

  • 如果您尝试替换 na.rmmaxmin 等原始函数中的工作方式,最好重写这些函数)
  • 我刚刚阅读了你的老问题,我想知道,如果你想在max() 电话中保留NaN,那么最大值是多少?我同意@mnel 并重写maxfunction,而不是这里计划的解决方法。
  • @mnel - 这可能是更明智的选择,因为我看到像我这样的答案有很多潜在的意外后果。
  • @thelatemail,原始函数无论如何都不会使用 is.na,所以除了潜在的意外后果之外,我认为修改 is.na 的任何解决方案都不会产生预期的后果。
  • @mnel - 看来你是对的。我检查了我的答案的敏感性,而不是特异性。我想这会让我学到东西。

标签: r overriding na


【解决方案1】:

我不确定这是否合法,但是呢:

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

这可能会违反 R 中的某些规则,并且可能会产生其他一些不良后果,但至少它的行为方式符合您的想法......

【讨论】:

  • 真正的 hacky,以一种可怕的绝妙方式。不过,我认为它应该可以工作,如果在任何其他上下文中没有在其他任何地方调用is.na,因为它是一个通用函数,并且在这些情况下可能会开始表现不佳。但是这些东西的问题是您可能必须在生产中进行测试,到那时,为时已晚......或者是吗? :[
  • 这只会影响你的代码,不会影响从其他包调用is.na的任何函数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-04
  • 1970-01-01
  • 1970-01-01
  • 2012-11-10
  • 2015-09-26
  • 2010-10-25
  • 1970-01-01
相关资源
最近更新 更多