work()
함수를 만들어서 무슨 작업인지는 모르지만 X초 동안 작업을 하게 만드는 도움 함수(helper function)를 만든다.
library(tidyverse)
library(progressr)
## 잠자기 함수 실행 도움 함수
function(second = 0) {
work <-Sys.sleep(second)
cat(second, "초 작업완료!\n")
}
work(1) # 1초 동안 쉼
1 초 작업완료!
각 작업의 단위는 1초로 1초에 해당되는 작업을 3번 작업 시킨다. 반환값이 없기 때문에 walk()
함수를 사용한다.
rep(1,3)
num_jobs <-walk(num_jobs, work)
1 초 작업완료!
1 초 작업완료!
1 초 작업완료!
작업이 진행되는 것을 보여주는 함수로 내장된 utils
팩키지 txtProgressBar()
함수가 있다. 앞의 함수를 조금 바꿔 입력받은 숫자를 제곱하는 결과를 반환하는 함수를 제작하나다. work_square()
함수는 1초 쉬고(작업하고) 제곱결과를 반환시킨다. 이를 txtProgressBar()
함수로 구현할 경우, setTxtProgressBar()
, getTxtProgressBar()
함수를 사용해서 기능을 구현한다.
function(x) {
work_square <-Sys.sleep(1)
return(x*x)
}
1:5
input_val <- txtProgressBar(max = length(input_val))
pb <-
walk(input_val, function(x) {
setTxtProgressBar(pb, getTxtProgressBar(pb)+1)
work_square(x)
})
================================================================================
close(pb)
1부터 10까지 작업을 출력시키는 작업을 두가지 방식을 통해 비교해보자. 화면에 단순 출력하는 방식이 있는 반면에, txtProgressBar()
함수를 기본으로 다양하게 보기 좋게 출력하는 방식이 존재한다.
화면에 단순 출력
walk(1:10, function(i) {
Sys.sleep(0.1)
print(i)
})
[1] 1
[1] 2
[1] 3
[1] 4
[1] 5
[1] 6
[1] 7
[1] 8
[1] 9
[1] 10
상태표시 막대
txtProgressBar(title = "progress bar", min = 0, max = 10, style = 3, width = 50) pb <-
|
| | 0%
walk(1:10, function(i) {
Sys.sleep(0.1)
setTxtProgressBar(pb, i, label = paste( round(i/total*100, 0), "% done"))
})
|
|===== | 10%
|
|========== | 20%
|
|=============== | 30%
|
|==================== | 40%
|
|========================= | 50%
|
|============================== | 60%
|
|=================================== | 70%
|
|======================================== | 80%
|
|============================================= | 90%
|
|==================================================| 100%
close(pb)
progressr
팩키지3progressr
팩키지 progress_bar
를 사용하면 진행사항을 시각적으로 확인할 수 있다.
library(beepr)
handlers("beepr")
function(x, progress = FALSE) {
snail <-
if (progress) pb <- progress::progress_bar$new(total=length(x))
walk(x, function(z) {
if (progress) pb$tick()
message(z, " 작업중 !!!")
work_square(z)
})
}
1:10
x <-# y <- snail(x)
snail(x, progress=TRUE) y <-
furrr
팩키지를 사용하고 무명함수를 밖으로 빼서 명시적으로 future_map()
을 통해 동시 진행사항에 대한 파악도 가능하다.
library(furrr)
plan(multisession, workers = 2)
function(x, p) {
fn <-p()
Sys.sleep(.2)
sum(x)
}
with_progress({
progressor(steps = length(x))
p <- future_map(x, fn, p = p)
result <- })
데이터 과학자 이광춘 저작
kwangchun.lee.7@gmail.com