在R中,我使用Min和Max来查找给定向量的最小值和最大值。

此向量是计算和过滤的结果,通常时间可能为NULL或空列表。

在这种情况下,我们会收到以下警告:


警告消息:在max(el)中:没有max的所有必输参数;
返回-Inf


如果您在一个循环(或多层)中针对多个输入执行此操作,则将开始遇到大量警告

Inf的默认值不适合我的用途,而是要返回0或其他某个值。

现在,除了每次检查输入是否在if..else条件下都是有效的之外,在输入为空的情况下,还有什么方法可以为这些Min,Max方法规定默认返回值。


例如,如果您使用na.rm = TRUE,则很难预先检查输入是否在删除NA后变为空。
另一种情况是min(which())。首先检查which()的返回值,然后有条件地提供给min()并不是我真正想要的东西。


另外,对Min,Max结果进行后处理以用我自己的值手动删除/替换Inf并不是真正有效的方法。

因此,是否有任何有效的方法可以要求R从Min,Max中返回我自己的自定义默认值,以获取空矢量,而不是+ Inf和-Inf?

使用if..else检查的预处理和使用Inf替换的后处理不太好用。

如果围绕Min,Max编写自定义包装是唯一的方法,那么您如何建议在不牺牲速度或优雅的情况下编写它呢?

最佳答案

好吧,它可能并不优雅,但这似乎可行:

mymax <- function(...,def='hello world',na.rm=FALSE)
    if(!is.infinite(x<-suppressWarnings(max(...,na.rm=na.rm)))) x else def

mymax() # 'hello world'
mymax(def=2) # 2
mymax(c(),NULL,def=2) # 2

mymax(c(),NA) # NA
mymax(1,c(NA,3),na.rm=TRUE) # 1


而且并不慢...

require(microbenchmark)
test <- rnorm(1e5)
microbenchmark(
    max=max(test),
    mymax=mymax(test)
)

# Unit: milliseconds
#   expr      min       lq   median       uq      max neval
#    max 1.135445 1.141384 1.143814 1.162171 1.689940   100
#  mymax 1.119248 1.123297 1.147054 1.190517 1.660244   100

09-11 05:32
查看更多