0Pricing
R Academy · บทเรียน

Environment ใน R คืออะไร

สำรวจ environment ในฐานะรายการที่มีชื่อและตัวชี้ไปยัง parent

Environment ใน R คืออะไร เป็นบทเรียน R Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน R Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส R Academy มีบทเรียนทั้งหมด 4 บทเรียน

Environment คืออะไร

ใน R environment คือกลุ่มการผูกชื่อเข้ากับค่า ซึ่งคล้ายรายการที่ตั้งชื่อ พร้อมตัวชี้ไปยัง environment แม่ ตัวแปรทุกตัวจะอยู่ใน environment บางแห่ง เมื่อ R ค้นหาชื่อ จะค้นหาใน environment ปัจจุบันก่อน จากนั้นจึงไล่ขึ้นตามสายโซ่ของ environment แม่

# The global environment holds your session variables
x <- 42
cat('x is in globalenv:', exists('x', envir = globalenv()), '\n')
cat('globalenv name:', environmentName(globalenv()), '\n')

globalenv(), baseenv() และ emptyenv()

R มี environment ที่ติดตั้งมาให้หลายแห่ง ได้แก่ globalenv() ซึ่งเป็นพื้นที่ทำงานแบบโต้ตอบของคุณ baseenv() ซึ่งเก็บฟังก์ชันพื้นฐานของ R และ emptyenv() ซึ่งอยู่บนสุดของสายโซ่และไม่มี environment แม่ สายโซ่ของ environment ทุกสายจะสิ้นสุดที่ emptyenv() ในท้ายที่สุด

cat('global    :', environmentName(globalenv()),  '\n')
cat('base      :', environmentName(baseenv()),    '\n')
cat('empty     :', environmentName(emptyenv()),   '\n')
cat('parent of global:', environmentName(parent.env(globalenv())), '\n')

สายโซ่ของ Environment

แต่ละ environment จะมี environment แม่ได้เพียงหนึ่งแห่ง ยกเว้น emptyenv() เมื่อ R ไม่พบชื่อใน environment ปัจจุบัน จะย้ายไปค้นหาใน environment แม่ จากนั้นจึงค้นหาใน environment แม่ของ environment แม่นั้นต่อไปเรื่อย ๆ สายโซ่นี้คือกลไกที่ R ใช้แก้ไขชื่อของตัวแปร

# Walk the parent chain from globalenv
env <- globalenv()
for (i in 1:5) {
  cat(sprintf('Level %d: %s\n', i, environmentName(env)))
  if (identical(env, emptyenv())) break
  env <- parent.env(env)
}

environment() สำหรับฟังก์ชัน

ฟังก์ชันทุกตัวมี environment ที่เกี่ยวข้อง ซึ่งก็คือ environment ที่ฟังก์ชันนั้นถูกสร้างขึ้น environment(f) จะคืน environment ดังกล่าว นี่คือ environment ที่หุ้มฟังก์ชัน และเป็นตัวกำหนดว่าฟังก์ชันจะค้นหาตัวแปรอิสระจากที่ใด

f <- function() 'hello'
cat('f was defined in:', environmentName(environment(f)), '\n')

# Inside a function, environment() returns its own env
show_env <- function() {
  cat('my env:', environmentName(environment()), '\n')
}
show_env()

as.list() กับ Environment

as.list(env) จะแปลงการผูกค่าของ environment ให้เป็นรายการที่ตั้งชื่อ ซึ่งมีประโยชน์สำหรับตรวจสอบเนื้อหาด้วยโปรแกรม การใช้ร่วมกับ globalenv() จะแสดงตัวแปรทั้งหมดในเซสชันปัจจุบัน

a <- 10
b <- 'hello'
c_val <- TRUE
# Show current global bindings as list
bindings <- as.list(globalenv())
cat('Names in globalenv:', paste(ls(globalenv()), collapse = ', '), '\n')

ls() — แสดงเนื้อหาของ Environment

ls() จะแสดงชื่อที่ถูกผูกไว้ใน environment โดยค่าเริ่มต้นจะแสดง global environment ส่ง envir = e เพื่อดู environment ที่ระบุ เพิ่ม all.names = TRUE เพื่อรวมชื่อที่ขึ้นต้นด้วย .

my_env <- new.env(parent = emptyenv())
my_env$x <- 1
my_env$y <- 'two'
my_env$.hidden <- TRUE
cat('Default ls:', ls(envir = my_env), '\n')
cat('All names :', ls(envir = my_env, all.names = TRUE), '\n')

new.env() — การสร้างสภาพแวดล้อม

new.env(parent = e) สร้างสภาพแวดล้อมว่างใหม่โดยมีสภาพแวดล้อมที่กำหนดเป็นสภาพแวดล้อมแม่ ใช้ emptyenv() เป็นสภาพแวดล้อมแม่เมื่อต้องการสภาพแวดล้อมที่แยกออกจากกันโดยสิ้นเชิงและไม่มีการผูกชื่อที่สืบทอดมา

e <- new.env(parent = emptyenv())
e$name  <- 'Alice'
e$score <- 95
cat('Names:', ls(e), '\n')
cat('Name binding:', e$name, '\n')

สภาพแวดล้อมกับรายการ

สภาพแวดล้อมดูคล้ายรายการที่มีชื่อ แต่ทำงานแตกต่างกัน: สภาพแวดล้อมจะถูกแก้ไขโดยตรงเสมอ (ไม่มีการคัดลอกเมื่อแก้ไข) มีสภาพแวดล้อมแม่ และค้นหาชื่อด้วยตารางแฮช (จึงรวดเร็ว) ส่วนรายการจะถูกคัดลอกเมื่อแก้ไข แต่สภาพแวดล้อมจะไม่ถูกคัดลอก

# Environments are reference objects (no copy-on-modify)
e <- new.env(parent = emptyenv())
e$x <- 1
f <- e        # f points to same env, not a copy
f$x <- 99
cat('e$x after modifying through f:', e$x, '\n')

exists() และ get() ในสภาพแวดล้อม

exists('name', envir = e) ตรวจสอบว่ามีการผูกชื่อไว้ในสภาพแวดล้อมหรือไม่ (โดยค่าเริ่มต้นจะตรวจสอบสภาพแวดล้อมแม่ด้วย) ส่วน get('name', envir = e) ดึงค่าดังกล่าว ทั้งสองฟังก์ชันรับ inherits = FALSE เพื่อค้นหาเฉพาะในสภาพแวดล้อมที่ระบุ

e <- new.env(parent = emptyenv())
e$pi_approx <- 3.14159
cat('exists pi_approx:', exists('pi_approx', envir = e), '\n')
cat('exists missing:  ', exists('missing_var', envir = e), '\n')
cat('get pi_approx:   ', get('pi_approx', envir = e), '\n')

environmentName() สำหรับสภาพแวดล้อมในตัว

environmentName(env) ส่งคืนชื่อที่มนุษย์อ่านเข้าใจได้ของสภาพแวดล้อมพิเศษ สภาพแวดล้อมที่ผู้ใช้สร้างจะส่งคืน '' (สตริงว่าง) ซึ่งช่วยให้คุณติดตามได้ว่าตัวแปรถูกกำหนดไว้ที่ใดขณะตรวจแก้จุดบกพร่อง

cat(environmentName(globalenv()),    '\n')  # R_GlobalEnv
cat(environmentName(baseenv()),      '\n')  # package:base
cat(environmentName(emptyenv()),     '\n')  # R_EmptyEnv
e <- new.env(parent = emptyenv())
cat('User env name: "', environmentName(e), '"\n', sep = '')

ภาคปฏิบัติ: การใช้สภาพแวดล้อมเป็นแคช

เนื่องจากสภาพแวดล้อมถูกแก้ไขโดยตรง จึงเหมาะสำหรับใช้เป็นแคชที่เปลี่ยนแปลงได้หรือตารางแฮช เก็บผลลัพธ์ที่คำนวณแล้วไว้ในสภาพแวดล้อมเพื่อหลีกเลี่ยงการคำนวณซ้ำ ซึ่งเร็วกว่าการแก้ไขรายการ (ที่ต้องคัดลอก)

cache <- new.env(parent = emptyenv(), hash = TRUE)
cached_square <- function(n) {
  key <- as.character(n)
  if (exists(key, envir = cache, inherits = FALSE))
    return(get(key, envir = cache))
  result <- n^2
  assign(key, result, envir = cache)
  result
}
cat(cached_square(7), '\n')
cat(cached_square(7), '\n')  # served from cache

ตรวจสอบความเข้าใจอย่างรวดเร็ว

สภาพแวดล้อมบนสุดในสายโซ่สภาพแวดล้อมของ R คือสภาพแวดล้อมใด ซึ่งไม่มีสภาพแวดล้อมแม่

สภาพแวดล้อม: ประเด็นสำคัญ

ประเด็นสำคัญเกี่ยวกับสภาพแวดล้อมของ R:

  • สภาพแวดล้อม = การผูกชื่อ + ตัวชี้ไปยังสภาพแวดล้อมแม่
  • globalenv() = พื้นที่ทำงานของคุณ; baseenv() = R พื้นฐาน; emptyenv() = จุดสิ้นสุดของสายโซ่
  • การค้นหาชื่อจะไล่ขึ้นไปตามสายโซ่สภาพแวดล้อมแม่จนกว่าจะพบ หรือถึง emptyenv()
  • ls(envir=e) แสดงรายการการผูกชื่อ; exists() ตรวจสอบ; get() ดึงค่า
  • สภาพแวดล้อมเป็นออบเจ็กต์แบบอ้างอิง จึงไม่มีการคัดลอกเมื่อแก้ไข
  • new.env(parent=emptyenv()) สร้างสภาพแวดล้อมที่แยกออกจากกัน
e <- new.env(parent = emptyenv())
assign('counter', 0L, envir = e)
for (i in 1:5) assign('counter', e$counter + 1L, envir = e)
cat('Counter:', e$counter, '\n')
cat('Env name:', environmentName(e), '\n')
cat('Bindings:', ls(e), '\n')

คำถามที่พบบ่อย

บทเรียน “Environment ใน R คืออะไร” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “Environment ใน R คืออะไร” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส R Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส R Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “Environment ใน R คืออะไร”

สำรวจ environment ในฐานะรายการที่มีชื่อและตัวชี้ไปยัง parent คุณปฏิบัติ R Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน R Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน R Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน

บทเรียน “Environment ใน R คืออะไร” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน R Academy นี้ได้ไหม

ได้ บทเรียน R Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. Environment ใน R คืออะไร
  2. กฎขอบเขตแบบเล็กซิคัล
  3. ขอบเขตส่วนกลางเทียบกับขอบเขตเฉพาะที่
  4. การสร้างและตรวจสอบ Environment
← กลับไปที่ R Academy