6

我目前正在运行一个 for 循环代码,并且在每个循环结束时,我正在测量循环的持续时间并打印一条消息,告诉用户循环花费了多长时间。

获得我正在使用的持续时间

duration <- difftime(end_time, start_time) 

这就是我打印声明的方式

print(paste("Loop", i, "took", duration, "to run.")). 

问题是每个循环的持续时间可能从 30 秒到 1 小时不等。将持续时间放在粘贴中只会将其转换为没有单位的数字。

例如

print(paste("Loop", i, "took", duration, "to run.")). 
"Loop 5 took 10.5 to run"

我如何从 difftime() 中获取单位以获得类似:“Loop 5 运行了 10.5 分钟。”

PS:有些人可能会建议通过在 difftime() 中声明“单位”参数来标准化持续时间,但我希望用户可以轻松理解持续时间,这就是我将单位设置为默认“自动”的原因。

4

3 回答 3

8

调用unitsfromduration以获取单位并通过子集获取数值duration

print(paste("Loop", i, "took", round(duration[[1]], 2),  units(duration), "to run."))

这是一个例子:

start_time <- Sys.time()

# few seconds later
end_time <- Sys.time()

duration <- difftime(end_time, start_time)

print(paste("Loop", 1, "took", round(duration[[1]], 2),  units(duration), "to run."))

结果:

[1] "Loop 1 took 6.97 secs to run."

根据持续时间的范围,该单位将是自动的。请参阅此其他示例:

start_time <- Sys.time()

# few days later
end_time <- as.Date("2019-01-23")

duration <- difftime(end_time, start_time)

print(paste("Loop", 1, "took", round(duration[[1]], 2),  units(duration), "to run."))

结果:

> print(paste("Loop", 1, "took", round(duration[[1]], 2),  units(duration), "to run."))
[1] "Loop 1 took 5.9 days to run."
于 2019-01-17T02:20:27.280 回答
3

difftime一种方法是在使用时捕获输出capture.output

start_time <- as.POSIXct('2019-01-01 02:34:00')
end_time <- as.POSIXct('2019-01-01 03:14:00')

paste("Loop 5 took", capture.output(difftime(end_time, start_time)), "to run.")
#[1] "Loop 5 took Time difference of 40 mins to run."

现在您可以更改输出以使其有意义,例如从输出中删除“时间差”

sent <- capture.output(difftime(end_time, start_time))
paste("Loop 5 took",sub("Time difference of ","", sent) , "to run.")
#[1] "Loop 5 took 40 mins to run."

对于另一个输入

start_time <- as.POSIXct('2019-01-01 02:34:00')
end_time <- as.POSIXct('2019-01-01 02:34:50')

sent <- capture.output(difftime(end_time, start_time))
paste("Loop 5 took",sub("Time difference of ","", sent) , "to run.")
#[1] "Loop 5 took 50 secs to run."
于 2019-01-17T02:19:38.690 回答
0

你应该能够通过它units(duration)

于 2019-01-17T02:22:11.867 回答