我发现将向量应用于我认为采用单个值的函数的魔力,但这似乎发生在我无法理解的区域,这导致我遇到的奇怪行为。< / 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="")
}
它有两个问题:
所以,这是一个很好的行为:
> 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的显而易见的事情不起作用,因为它们对传入的整个向量进行操作。
答案 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)))
}
应该或多或少地做你要求的事情。