2017-09-17 18 views
6

Trong người dùng ứng dụng Shiny của tôi có thể tạo báo cáo powerpoint nặng. Khi nó chứa nhiều trang trình bày, có thể mất> 30 phút để hoàn thành. Và do đó, tôi muốn xử lý các tác vụ đó trong các quy trình/nhiệm vụ độc lập có thể hoạt động ngay cả khi ứng dụng bị đóng - ví dụ: người dùng nhấp vào nút để tạo báo cáo, đóng ứng dụng và khi báo cáo là ứng dụng sẵn sàng thông báo cho người dùng qua email. Có thực hành tốt hay giải pháp đã được chứng minh nào để thực hiện điều này không?R Nhiệm vụ/tập lệnh chạy sáng bóng trong quy trình khác nhau

Suy nghĩ đầu tiên của tôi là sử dụng gói future với plan(multisession) bộ - nhưng tôi không chắc điều gì sẽ xảy ra khi người dùng đóng ứng dụng - future phiên cũng đóng quá?

+0

'mcparallel' có phù hợp với bạn không? https://stat.ethz.ch/R-manual/R-devel/library/parallel/html/mcparallel.html –

+0

@Roman Luštrik, vâng, nhưng 'mcparallel' cho phép tôi tạo phiên độc lập hoạt động ngay cả sau khi tôi đóng ứng dụng? – Taz

+0

Tôi không có quyền truy cập vào máy unix nên tôi không thể thực sự kiểm tra nó. –

Trả lời

8

Tôi đã may mắn được ở London EARL tuần này và tôi nghĩ một trong những bài thuyết trình hay nhất tôi đã thấy có chính xác điều này (bởi Joe Cheng). Bạn sẽ cần gói promises để làm việc này và như đã nói trên tài liệu có phiên bản đặc biệt của bóng devtools::install_github("rstudio/[email protected]") hỗ trợ lập trình không đồng bộ.

Bạn có thể tìm thấy tài liệu đầu tiên here về cách hoạt động của tính năng này bằng cách sử dụng dplyrpromises (future cũng tương thích).

Như một ví dụ nhỏ (lấy từ tài liệu), chạy một tính toán chuyên sâu bằng cách sử dụng sau đây:

read.csv.async("data.csv") %...>% 
    filter(state == "NY") %...>% 
    arrange(median_income) %...>% 
    head(10) %...>% 
    View() 

về cơ bản sẽ quay trở lại giao diện điều khiển con trỏ trở lại, cho phép bạn chạy bất kỳ lệnh khác mà bạn muốn và sẽ tự động mở tab View sau khi hoàn tất. Tôi có thể tìm ra một ví dụ sáng bóng trong một chút, nhưng hãy nhớ rằng điều này vẫn đang được phát triển và sẽ được phát hành trước cuối năm (với một tài liệu toàn diện hơn tôi sẽ tưởng tượng).

+2

Tác giả của tương lai tại đây; Tôi xác nhận những gì Joe đang làm ở đây sẽ giải quyết vấn đề này. (Phần mà OP muốn đóng ứng dụng và quay lại với nó sau này là phức tạp hơn; Tôi có hỗ trợ cho các tương lai có thể lặp lại và có thể tải lại liên tục trên danh sách việc cần làm của tôi nhưng sẽ mất chút thời gian) – HenrikB

0

Vì vậy, tôi đã giải quyết một số ví dụ bằng cách sử dụng gói future. Mã thực hiện trong phiên riêng biệt (cụm) ngay cả khi ứng dụng bị đóng. Tôi nghĩ rằng bước tiếp theo chỉ là tìm ra cách ứng dụng nên kiểm tra xem quá trình vẫn đang chạy hay đã kết thúc. Bất kỳ ý tưởng?

library(future) 
cl <- parallel::makeCluster(2L) 
plan(cluster, workers = cl) 

server <- function(input, output) { 
    observeEvent(input$run, { 

    iteration <- as.numeric(input$iteration) 
    path <- input$path 

    future::future({ 
     writeLog <- function(n, path) { 
     file.remove(path) 
     for (i in 1:n) { 
      cat("#", i, "-", as.character(Sys.time()), "\n", file = path, append = TRUE) 
      Sys.sleep(1) 
     } 
     } 
     writeLog(iteration, path) 
    }, globals = c("iteration", "path")) 
    }) 
} 

ui <- fluidPage(
    sidebarLayout(
    sidebarPanel(
     tags$div("This app writes to file in cluster which means it is computed in parallel to this session. 
       It will execute even when app is closed.") 
     , br() 
     , shiny::textInput("path", "Path to log file", value = "/src/dev/export_performance/future.log") 
     , shiny::textInput("iteration", "Iteration number", value = 60)  
    ), 
    mainPanel(
     br() 
     , actionButton("run", "Run future") 
    ) 
) 
) 

shinyApp(ui = ui, server = server) 
Các vấn đề liên quan