6

如何矢量化这个函数?

difftime2string <- function (x) {
  if (abs(x) < 1) return(sprintf("%.2fms",x*1000))
  if (abs(x) < 100) return(sprintf("%.2fsec",x))
  if (abs(x) < 6000) return(sprintf("%.2fmin",x/60))
  if (abs(x) < 108000) return(sprintf("%.2fhrs",x/3600))
  if (abs(x) < 400*24*3600) return(sprintf("%.2fdays",x/(24*3600)))
  sprintf("%.2fyears",x/(365.25*24*3600))
}

编辑:我的意思是没有Vectorize- 我如何编写带有许多ifs 的矢量化代码。

4

2 回答 2

13
difftime2string <- function(x) {
    breaks <- c(0, 1, 100, 6000, 108000, 400*24*3600, Inf)
    units <- c("ms", "sec", "min", "hrs", "days", "years")
    fact <- c(1000, 1, 1/60, 1/3600, 1/(24*3600), 1/(365.25*24*3600))
    ii <- findInterval(x, breaks)
    sprintf(paste0("%.2f", units[ii]), x*fact[ii])
}

x <- c(.1, 2, 200, 6001, 109000, 500*24*3600)
difftime2string(x)
# [1] "100.00ms"  "2.00sec"   "3.33min"   "1.67hrs"   "1.26days"  "1.37years"
于 2013-09-12T15:20:40.247 回答
9

零思考地做这样的事情的最简单方法就是使用Vectorize

difftime2stringVect <- Vectorize(difftime2string)
于 2013-09-12T15:00:39.970 回答