0Pricing
R Academy · Pelajaran

Lingkup Global vs Lokal

Bedakan .GlobalEnv, environment fungsi, dan closure.

Lingkup Global vs Lokal adalah pelajaran R Academy gratis di CoddyKit. Ini adalah pelajaran 3 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.

Variabel Lokal dalam Fungsi

Variabel yang diberi nilai dengan <- atau = di dalam tubuh fungsi bersifat lokal bagi fungsi tersebut. Variabel itu dibuat di lingkungan milik fungsi dan menghilang ketika fungsi selesai. Variabel tersebut tidak pernah memengaruhi lingkup pemanggil.

x <- 'global'
f <- function() {
  x <- 'local'   # creates a new local binding, does not modify global x
  cat('Inside f: x =', x, '\n')
}
f()
cat('Outside f: x =', x, '\n')  # still 'global'

Parameter Fungsi Bersifat Lokal

Parameter fungsi juga merupakan variabel lokal. Mengubah parameter di dalam fungsi tidak memengaruhi argumen di lingkungan pemanggil. R meneruskan argumen berdasarkan nilai (dengan semantik penyalinan saat diubah).

double_it <- function(n) {
  n <- n * 2      # modifies local copy only
  cat('Inside:', n, '\n')
}
my_n <- 5
double_it(my_n)
cat('Outside:', my_n, '\n')  # still 5

<<- untuk Penugasan Global

<<- (penugasan super) mencari ke atas sepanjang rantai induk dan memberikan nilai pada kecocokan pertama yang ditemukan. Jika tidak ada kecocokan di mana pun, operator ini membuat binding tersebut di lingkungan global. Gunakan secukupnya — penggunaan <<- secara berlebihan membuat fungsi sulit dipahami.

total <- 0
add_to_total <- function(x) {
  total <<- total + x
}
add_to_total(10)
add_to_total(25)
add_to_total(5)
cat('Total:', total, '\n')

<<- Mencari ke Atas Sepanjang Rantai

<<- tidak langsung memberikan nilai ke lingkungan global — operator ini berjalan ke atas sepanjang rantai induk dan memberikan nilai pada lingkungan pertama tempat nama tersebut sudah ada. Jika variabel ada di fungsi yang melingkupi, variabel itu akan diperbarui di sana.

outer <- function() {
  n <- 0
  increment <- function() n <<- n + 1
  increment()
  increment()
  cat('n in outer:', n, '\n')  # n was in outer's env, updated there
}
outer()
# n does NOT appear in global env
cat('n in global:', exists('n', envir = globalenv()), '\n')

assign() untuk Menentukan Target Lingkungan Secara Eksplisit

assign('name', value, envir = e) memberikan nilai langsung ke lingkungan tertentu. Cara ini lebih eksplisit daripada <<- dan berguna ketika Anda memiliki objek lingkungan dan ingin menetapkan nilai di dalamnya secara tepat.

my_env <- new.env(parent = emptyenv())
assign('score', 95, envir = my_env)
assign('name', 'Alice', envir = my_env)
cat('score:', get('score', envir = my_env), '\n')
cat('name :', get('name',  envir = my_env), '\n')

local() — Blok Kode Terisolasi

local({...}) mengevaluasi suatu ekspresi di lingkungan lokal baru. Variabel yang dibuat di dalam blok tidak merembes ke lingkungan global. Ini berguna untuk perhitungan sementara yang tidak seharusnya mengotori ruang kerja.

result <- local({
  temp1 <- 100
  temp2 <- 200
  temp1 + temp2   # the last expression is returned
})
cat('result:', result, '\n')
cat('temp1 in global:', exists('temp1'), '\n')  # FALSE

local() vs. Fungsi untuk Isolasi

local() dan fungsi yang langsung dipanggil sama-sama menyediakan isolasi lingkup. local() lebih ringkas untuk isolasi sekali pakai; fungsi bernama lebih baik jika logika tersebut ingin Anda gunakan kembali atau uji.

# Option A: local()
result_a <- local({
  x <- 7
  y <- 3
  x * y
})
# Option B: immediately invoked function
result_b <- (function() {
  x <- 7
  y <- 3
  x * y
})()
cat(result_a, result_b, '\n')
cat('x in global:', exists('x'), '\n')

Membaca Variabel Global dari Fungsi

Fungsi dapat membaca variabel dari lingkup yang melingkupinya (baik global maupun lainnya) tanpa sintaks khusus. Ini merupakan lingkup leksikal standar. Namun, terlalu bergantung pada keadaan global membuat fungsi lebih sulit diuji — jika memungkinkan, utamakan argumen eksplisit.

tax_rate <- 0.20   # global configuration
apply_tax <- function(price) {
  price * (1 + tax_rate)  # reads tax_rate from global
}
cat(apply_tax(100), '\n')
cat(apply_tax(250), '\n')

Pembayangan Variabel

Ketika variabel lokal memiliki nama yang sama dengan variabel global, binding lokal membayangi binding global. Di dalam fungsi, versi lokal yang digunakan. Variabel global tidak berubah. Hal ini dapat menyebabkan kesalahan yang sulit terlihat jika terjadi tanpa sengaja.

mean <- 99   # shadows base R's mean() function
cat(mean, '\n')   # prints 99, not the function
# To call the real mean, use base:: prefix
cat(base::mean(c(1, 2, 3, 4, 5)), '\n')
rm(mean)   # remove the shadow

Lingkungan function()

Setiap kali fungsi dipanggil, R membuat lingkungan baru untuk pemanggilan tersebut, dengan lingkungan yang melingkupi fungsi sebagai induknya. Variabel lokal dari pemanggilan yang berbeda tidak saling mengganggu, termasuk pada pemanggilan rekursif.

factorial_r <- function(n) {
  # Each recursive call has its own local n
  if (n <= 1) return(1)
  n * factorial_r(n - 1)
}
cat('5! =', factorial_r(5), '\n')
cat('7! =', factorial_r(7), '\n')

rm() untuk Menghapus Variabel

rm('name') atau rm(name) menghapus binding dari lingkungan saat ini (atau lingkungan yang ditentukan). Gunakan ini untuk membersihkan variabel sementara. Teruskan envir = e untuk menghapusnya dari lingkungan tertentu.

x <- 42
y <- 'hello'
cat('Before rm:', ls(), '\n')
rm(x)
cat('After rm(x):', exists('x'), '\n')
rm('y')
cat('After rm(y):', exists('y'), '\n')

Pemeriksaan Singkat

Apa yang dilakukan <<- tetapi tidak dilakukan oleh <- biasa?

Lingkup: Inti Pembelajaran

Inti pembelajaran tentang lingkup global vs lokal:

  • <- di dalam fungsi membuat variabel lokal — variabel global tidak berubah
  • Parameter fungsi bersifat lokal; R meneruskan berdasarkan nilai (penyalinan saat diubah)
  • <<- bergerak naik sepanjang rantai induk dan mengubah binding pertama yang cocok
  • assign('x', val, envir=e) untuk penugasan yang secara eksplisit menargetkan lingkungan
  • local({...}) menyediakan lingkup sementara tanpa membuat fungsi bernama
  • Hindari membayangi nama penting (seperti mean, c, T)
# Demonstrate local + <<- cleanly
running_sum <- 0
local({
  values <- c(10, 20, 30, 40)
  for (v in values) running_sum <<- running_sum + v
})
cat('Running sum:', running_sum, '\n')
cat('values in global:', exists('values'), '\n')

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Lingkup Global vs Lokal” gratis?

Ya — teks lengkap “Lingkup Global vs Lokal” 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 “Lingkup Global vs Lokal”?

Bedakan .GlobalEnv, environment fungsi, dan closure. 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 3 dari 4.

Berapa lama pelajaran “Lingkup Global vs Lokal” 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

  1. Apa Itu Environment dalam R?
  2. Aturan Lingkup Leksikal
  3. Lingkup Global vs Lokal
  4. Membuat dan Memeriksa Environment
← Kembali ke R Academy