Kerangka Kerja future
Gunakan plan(multisession) dan future() untuk pemrosesan paralel asinkron yang portabel.
Kerangka Kerja future adalah pelajaran R Academy gratis di CoddyKit. Ini adalah pelajaran 2 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar R Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus R Academy mencakup 4 pelajaran total.
Apa Itu Paket future?
Paket future menyediakan API terpadu tingkat tinggi untuk pemrograman asinkron dan paralel dalam R. Sebuah future adalah tempat penampung untuk nilai yang akan tersedia nanti—yang mungkin dihitung pada inti prosesor atau mesin lain.
library(future)
# A simple future: computation happens asynchronously
f <- future({
Sys.sleep(0.5) # simulate slow work
42
})
cat('Future created, doing other work...\n')
# Retrieve the result (blocks until done)
result <- value(f)
cat('Result:', result, '\n')plan(): Memilih Backend
plan() menetapkan strategi eksekusi untuk semua future berikutnya. Strategi yang paling umum adalah sequential (bawaan, satu utas), multisession (beberapa sesi R, berfungsi di semua sistem), dan multicore (pembuatan proses bercabang, hanya Unix/macOS).
library(future)
# Default: sequential (no parallelism)
plan(sequential)
cat('Strategy:', class(plan())[1], '\n')
# Parallel with separate R sessions (works on Windows too)
plan(multisession, workers = 4)
cat('Strategy:', class(plan())[1], '\n')
# Forking (Unix/macOS only, lower overhead)
if (.Platform$OS.type != 'windows') {
plan(multicore, workers = 4)
cat('Strategy:', class(plan())[1], '\n')
}
# Reset to sequential
plan(sequential)value(): Menunggu Hasil
value(f) memblokir proses saat ini hingga perhitungan future selesai, lalu mengembalikan hasilnya. Jika future menghasilkan error, value() akan menghasilkan kembali error tersebut dalam sesi pemanggil.
library(future)
plan(multisession, workers = 2)
# Launch two slow tasks concurrently
f1 <- future({ Sys.sleep(0.3); sum(1:1000) })
f2 <- future({ Sys.sleep(0.3); prod(1:10) })
# Both run in parallel; total time ~ 0.3s not 0.6s
start <- proc.time()[['elapsed']]
v1 <- value(f1)
v2 <- value(f2)
elapsed <- proc.time()[['elapsed']] - start
cat('v1:', v1, ' v2:', v2, '\n')
cat('Elapsed:', round(elapsed, 2), 's\n')
plan(sequential)Operator %<-%
Operator %<-% adalah sintaks ringkas untuk future() + value() malas. Bentuknya seperti penetapan biasa, tetapi sisi kanan berjalan secara asinkron. Nilai diambil saat variabel pertama kali diakses.
library(future)
plan(multisession, workers = 2)
# %<-% starts the computation immediately in the background
x %<-% {
Sys.sleep(0.3)
rnorm(5, mean = 10)
}
y %<-% {
Sys.sleep(0.3)
runif(5, min = 1, max = 5)
}
cat('Both running in background...\n')
# Accessing x or y here blocks until ready
cat('x:', round(x, 2), '\n')
cat('y:', round(y, 2), '\n')
plan(sequential)Deteksi Global Otomatis
Salah satu fitur paling kuat dari future adalah deteksi variabel global: fitur ini secara otomatis menemukan variabel yang dirujuk oleh kode future Anda dalam lingkungan pemanggil dan mengirimkannya ke pekerja—tanpa memerlukan clusterExport() secara manual.
library(future)
plan(multisession, workers = 2)
# These globals are auto-detected and sent to the worker
threshold <- 50
multiplier <- 3
f <- future({
x <- threshold * multiplier # uses both globals
x + 1
})
cat('Result:', value(f), '\n') # 151
# Inspect which globals were identified
future_obj <- future({
threshold + multiplier
}, lazy = TRUE)
cat('Globals found:', paste(names(future::getGlobalsAndPackages(future_obj)$globals), collapse = ', '), '\n')
plan(sequential)future_options: Menyesuaikan Perilaku
future.options (diakses melalui argumen options() atau future::plan()) mengendalikan pengaturan global: memori maksimum yang diizinkan untuk setiap future, strategi deteksi global, dan perilaku batas waktu.
library(future)
# Cap memory per future at 500 MB
options(future.globals.maxSize = 500 * 1024^2) # bytes
# Disable automatic global detection (manual control)
options(future.globals.onReference = 'error')
# Inspect current settings
cat('Max globals size (MB):',
getOption('future.globals.maxSize') / 1024^2, '\n')
# Restore defaults
options(future.globals.maxSize = 500 * 1024^2)
options(future.globals.onReference = NULL)
plan(multisession, workers = 2)
# Large object: you'd get an error if it exceeds the cap
big_vec <- 1:1e5 # small enough
f <- future(sum(big_vec))
cat('Sum:', value(f), '\n')
plan(sequential)Future Bertingkat
Future dapat dibuat bertingkat: sebuah future dapat membuat future bagian dalam. Secara bawaan, future bagian dalam berjalan secara berurutan, kecuali Anda menetapkan rencana bertingkat dengan plan(list(...)). Ini berguna untuk paralelisme dua tingkat.
library(future)
# Two-level parallelism: outer uses multisession, inner sequential
plan(list(multisession, sequential))
outer_futures <- lapply(1:3, function(i) {
future({
# Each outer worker runs its own sequential inner work
inner <- lapply(1:4, function(j) i * j)
unlist(inner)
})
})
results <- lapply(outer_futures, value)
for (i in seq_along(results)) {
cat('Outer', i, ':', results[[i]], '\n')
}
plan(sequential)Penanganan Error dengan Future
Ketika perhitungan future menghasilkan error, value() akan menghasilkan kembali error tersebut. Bungkus value() dengan tryCatch() untuk menangani error pada setiap future tanpa menghentikan seluruh alur kerja Anda.
library(future)
plan(multisession, workers = 2)
# This future will error
bad_future <- future(log(-1, base = 'oops')) # invalid arg
good_future <- future(sqrt(144))
# Handle errors gracefully
bad_result <- tryCatch(
value(bad_future),
error = function(e) {
cat('Caught error:', conditionMessage(e), '\n')
NA
}
)
good_result <- value(good_future)
cat('bad_result:', bad_result, '\n')
cat('good_result:', good_result, '\n')
plan(sequential)Memeriksa Status Future
resolved(f) mengembalikan TRUE jika sebuah future telah selesai tanpa memblokir. Dengan demikian, Anda dapat memeriksa penyelesaian secara berkala dan melakukan pekerjaan yang berguna sambil menunggu, sehingga membuat perulangan pemeriksaan tanpa pemblokiran.
library(future)
plan(multisession, workers = 2)
f <- future({
Sys.sleep(0.5)
'done'
})
# Poll without blocking
counter <- 0
while (!resolved(f)) {
counter <- counter + 1
Sys.sleep(0.1)
cat('Polling... (', counter, ')\n')
}
cat('Future resolved! Result:', value(f), '\n')
cat('Polled', counter, 'times\n')
plan(sequential)Menggabungkan future dengan lapply
Gabungkan lapply() dengan future() untuk membagi N tugas, lalu gunakan lapply() dengan value() untuk mengumpulkan hasil. Pola ini memberi Anda kendali eksplisit atas waktu dimulainya setiap future.
library(future)
plan(multisession, workers = 4)
# Fan out: create all futures
params <- list(
list(n = 1000, mean = 0),
list(n = 1000, mean = 5),
list(n = 1000, mean = 10),
list(n = 1000, mean = -3)
)
futures <- lapply(params, function(p) {
future({
x <- rnorm(p$n, mean = p$mean)
list(mean = mean(x), sd = sd(x))
})
})
# Fan in: collect results
results <- lapply(futures, value)
for (i in seq_along(results)) {
cat('Param mean', params[[i]]$mean,
'-> observed mean:', round(results[[i]]$mean, 3), '\n')
}
plan(sequential)Kasus Penggunaan Nyata: Evaluasi Lipatan CV
Validasi silang adalah masalah yang sangat mudah diparalelkan: setiap lipatan berdiri sendiri. Dengan menggunakan future, Anda dapat mengevaluasi semua K lipatan secara bersamaan, sehingga secara signifikan mengurangi waktu jam dinding untuk model yang mahal.
library(future)
plan(multisession, workers = 4)
set.seed(42)
data <- data.frame(x = rnorm(200), y = rnorm(200))
fold_ids <- sample(rep(1:4, 50))
# Launch all folds in parallel
fold_futures <- lapply(1:4, function(k) {
future({
train <- data[fold_ids != k, ]
test <- data[fold_ids == k, ]
fit <- lm(y ~ x, data = train)
preds <- predict(fit, newdata = test)
rmse <- sqrt(mean((test$y - preds)^2))
rmse
})
})
rmses <- unlist(lapply(fold_futures, value))
cat('Fold RMSEs:', round(rmses, 4), '\n')
cat('Mean RMSE:', round(mean(rmses), 4), '\n')
plan(sequential)Pemeriksaan Singkat
Anda ingin menjalankan kode paralel yang berfungsi di Windows dan macOS. Strategi plan() mana yang harus Anda pilih?
Ringkasan: Kerangka Kerja future
Hal-hal penting:
future({expr})menjalankan expression secara asinkron;value(f)mengambil hasilnya%<-%adalah sintaks ringkas—penetapan dengan evaluasi future malasplan(multisession)untuk lintas platform;plan(multicore)untuk percabangan Unix/macOS- Variabel global dideteksi dan dikirim ke pekerja secara otomatis—tidak memerlukan
clusterExport() resolved(f)memeriksa penyelesaian tanpa memblokir- Bungkus
value()dengantryCatch()untuk alur kerja yang tahan terhadap error - Selalu panggil
plan(sequential)atauplan()untuk mengatur ulang setelah selesai
library(future)
plan(multisession, workers = 2)
# Concise pattern: fan-out then fan-in
task <- function(i) future({ i^2 + i })
results <- lapply(1:6, task)
cat(unlist(lapply(results, value)), '\n') # 2 6 12 20 30 42
plan(sequential)Belajar R dengan tutor AI — gratis
Tulis dan jalankan kode asli di browser kamu, dapatkan bantuan instan dari tutor AI 24/7, dan lanjutkan di mana kamu tinggalkan di web atau aplikasi.
- Kursus
- 43
- Pelajaran
- 159
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Kerangka Kerja future” gratis?
Ya — teks lengkap “Kerangka Kerja future” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus R Academy, upgrade ke CoddyKit PRO. Kursus R Academy mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Kerangka Kerja future”?
Gunakan plan(multisession) dan future() untuk pemrosesan paralel asinkron yang portabel. Kamu berlatih R Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai R Academy?
Tidak diperlukan pengalaman sebelumnya. R Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 2 dari 4.
Berapa lama pelajaran “Kerangka Kerja future” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran R Academy ini?
Ya. Setiap pelajaran R Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Paket parallel dan detectCores()
- Kerangka Kerja future
- furrr: Operasi purrr Paralel
- Men-debug dan Menyeimbangkan Beban Kode Paralel