Как мне работать со специальными значениями в моей функции при работе с вектором? - PullRequest
2 голосов
/ 24 августа 2011

Я обнаружил магию применения векторов к функциям, которые, как мне кажется, принимают отдельные значения, но это, кажется, происходит в тех областях, которые я не могу понять, что приводит к странному поведению, с которым мне трудно иметь дело.

Например, у меня есть эта функция форматирования времени:

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

Итак, у него хорошее поведение:

> 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" для больших значений? Выполнение очевидных вещей из оператора «если» и минимума не работало, потому что они работали со всем переданным вектором.

1 Ответ

5 голосов
/ 24 августа 2011

Это то, что вы используете 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)))
}

должен делать более или менее то, что вы просите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...