Я обнаружил магию применения векторов к функциям, которые, как мне кажется, принимают отдельные значения, но это, кажется, происходит в тех областях, которые я не могу понять, что приводит к странному поведению, с которым мне трудно иметь дело.
Например, у меня есть эта функция форматирования времени:
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="")
}
У него две проблемы:
- Разрывается при подаче 0.
- Разрывается при вводе значений> = 1e9
Итак, у него хорошее поведение:
> 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" для больших значений? Выполнение очевидных вещей из оператора «если» и минимума не работало, потому что они работали со всем переданным вектором.