在向量上操作时,如何处理函数中的特殊值?

时间:2011-08-24 07:21:46

标签: r

我发现将向量应用于我认为采用单个值的函数的魔力,但这似乎发生在我无法理解的区域,这导致我遇到的奇怪行为。< / p>

例如,我有这个格式化功能:

timeFmt <- function(s) {
    sizes <- c('µs', 'ms', 's')
    e <- floor(log(s, 1000))
    suffix <- sizes[e+1]
    prefix <- sprintf("%g", s/(1000 ^ floor(e)))
    paste(prefix, suffix, sep="")
}

它有两个问题:

  1. 供应0时中断。
  2. 当提供的值>> 1e9
  3. 时,它会中断

    所以,这是一个很好的行为:

    > timeFmt(10 ** (0:8))
    [1] "1µs"   "10µs"  "100µs" "1ms"   "10ms"  "100ms" "1s"    "10s"   "100s" 
    

    ......但这种令人讨厌的行为:

    > tf(c(0, 1, 10, 100, 1000, 1e9))
    [1] "NaNNA" "1µs"   "10µs"  "100µs" "1ms"   "1NA"  
    

    如何让我的函数为0返回“0”,并使用“s”后缀为更大的值?做一个“if”语句和min的显而易见的事情不起作用,因为它们对传入的整个向量进行操作。

1 个答案:

答案 0 :(得分:5)

这是您使用ifelse的内容。以你的例子:

defTimeFmt <- function(s) { #this is just your original function I renamed
    sizes <- c('µs', 'ms', 's')
    e <- floor(log(s, 1000))
    suffix <- sizes[e+1]
    prefix <- sprintf("%g", s/(1000 ^ floor(e)))
    paste(prefix, suffix, sep="")
}

timeFmt<-function(s) {
    ifelse(s==0, "0", ifelse(s>= 1e9, "s", defTimeFmt(s)))
}

应该或多或少地做你要求的事情。