Как вы извлекаете единицу времени при использовании difftime ()? - PullRequest
0 голосов
/ 17 января 2019

В настоящее время я выполняю код цикла 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 (), чтобы получить что-то вроде: "Для цикла 5 потребовалось 10,5 минут."

PS: Некоторые могут предложить стандартизировать длительность, объявив аргумент "unit" в difftime (), но я хочу, чтобы продолжительность была легко понятна пользователю, поэтому я установил для единицы значение по умолчанию "auto".

Ответы [ 3 ]

0 голосов
/ 17 января 2019

Позвоните units из duration, чтобы получить единицу измерения и получить числовое значение путем подстановки 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."
0 голосов
/ 17 января 2019

Вы должны быть в состоянии получить это через units(duration).

0 голосов
/ 17 января 2019

Один из способов - захватить вывод из 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."
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...