如何在 R 中使执行暂停、睡眠、等待 X 秒?

如何将 R 脚本暂停指定的秒或毫秒数?在许多语言中,有一个 sleep函数,但是 ?sleep引用一个数据集。?pause?wait都不存在。

目的是用于自定时动画。所需的解决方案不需要用户输入即可工作。

142295 次浏览

参见 help(Sys.sleep)

例如,从 ?Sys.sleep

testit <- function(x)
{
p1 <- proc.time()
Sys.sleep(x)
proc.time() - p1 # The cpu usage should be negligible
}
testit(3.7)

屈服

> testit(3.7)
user  system elapsed
0.000   0.000   3.704

如果 CPU 使用率非常高,那么 Sys.sleep ()将无法工作; 正如其他关键的高优先级进程正在并行运行一样。

这段代码对我很有用。这里我以2.5秒的间隔打印1到1000。

for (i in 1:1000)
{
print(i)
date_time<-Sys.time()
while((as.numeric(Sys.time()) - as.numeric(date_time))<2.5){} #dummy while loop
}

一种新的稳定而精确的睡眠功能

我们已经知道 Sys.sleep不能像预期的那样工作,例如当 CPU 使用率很高时。
这就是为什么我决定准备一个由 microbenchmark::get_nanotime()while/repeat机械高品质的功能。

#' Alternative to Sys.sleep function
#' Expected to be more stable
#' @param val `numeric(1)` value to sleep.
#' @param unit `character(1)` the available units are nanoseconds ("ns"), microseconds ("us"), milliseconds ("ms"), seconds ("s").
#' @note dependency on `microbenchmark` package to reuse `microbenchmark::get_nanotime()`.
#' @examples
#' # sleep 1 second in different units
#' sys_sleep(1, "s")
#' sys_sleep(100, "ms")
#' sys_sleep(10**6, "us")
#' sys_sleep(10**9, "ns")
#'
#' sys_sleep(4.5)
#'
sys_sleep <- function(val, unit = c("s", "ms", "us", "ns")) {
start_time <- microbenchmark::get_nanotime()
stopifnot(is.numeric(val))
unit <- match.arg(unit, c("s", "ms", "us", "ns"))
val_ns <- switch (unit,
"s" = val * 10**9,
"ms" = val * 10**7,
"us" = val * 10**3,
"ns" = val
)
repeat {
current_time <- microbenchmark::get_nanotime()
diff_time <- current_time - start_time
if (diff_time > val_ns) break
}
}


system.time(sys_sleep(1, "s"))
#>    user  system elapsed
#>   1.015   0.014   1.030
system.time(sys_sleep(100, "ms"))
#>    user  system elapsed
#>   0.995   0.002   1.000
system.time(sys_sleep(10**6, "us"))
#>    user  system elapsed
#>   0.994   0.004   1.000
system.time(sys_sleep(10**9, "ns"))
#>    user  system elapsed
#>   0.992   0.006   1.000


system.time(sys_sleep(4.5))
#>    user  system elapsed
#>   4.490   0.008   4.500

创建于2022-11-21与 Reprex v2.0.2