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

การสร้างและตรวจสอบ Environment

ใช้ new.env(), environment(), ls() และ get() เพื่อทำงานกับ environment

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

การสร้างสภาพแวดล้อมใหม่

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

# Isolated environment (no parent chain)
e1 <- new.env(parent = emptyenv())
# Environment with global as parent
e2 <- new.env(parent = globalenv())
cat('e1 parent:', environmentName(parent.env(e1)), '\n')
cat('e2 parent:', environmentName(parent.env(e2)), '\n')

assign() — เพิ่มการผูกชื่อ

assign('name', value, envir = e) สร้างหรืออัปเดตการผูกชื่อในสภาพแวดล้อมที่ระบุ ซึ่งเทียบเท่ากับการเขียน e$name <- value ในเชิงโปรแกรม แต่ใช้ได้เมื่อชื่อถูกเก็บไว้ในตัวแปร

e <- new.env(parent = emptyenv())
assign('x', 10, envir = e)
assign('y', 'hello', envir = e)
assign('z', TRUE, envir = e)
cat('x:', get('x', envir = e), '\n')
cat('y:', get('y', envir = e), '\n')

get() และ mget()

get('name', envir = e) ดึงการผูกชื่อรายการเดียว mget(c('a','b'), envir = e) ดึงการผูกชื่อหลายรายการพร้อมกัน โดยส่งคืนเป็นรายการที่มีชื่อ ทั้งสองฟังก์ชันจะแสดงข้อผิดพลาดหากไม่มีชื่อนั้น (เว้นแต่ inherits อนุญาตให้ค้นหาตามสายโซ่)

e <- new.env(parent = emptyenv())
e$alpha <- 1
e$beta  <- 2
e$gamma <- 3
# Single
get('alpha', envir = e)
# Multiple
mget(c('alpha', 'beta', 'gamma'), envir = e)

ls() — แสดงรายการการผูกชื่อ

ls(envir = e) ส่งคืนเวกเตอร์อักขระของชื่อทั้งหมดที่ผูกไว้ในสภาพแวดล้อม e เพิ่ม all.names = TRUE เพื่อรวมชื่อที่ขึ้นต้นด้วย . (โดยค่าเริ่มต้นจะซ่อนไว้) ชื่อที่ส่งคืนจะเรียงตามลำดับตัวอักษร

e <- new.env(parent = emptyenv())
e$b_val  <- 2
e$a_val  <- 1
e$.secret <- 'hidden'
cat('Default ls:', ls(envir = e), '\n')
cat('All names :', ls(envir = e, all.names = TRUE), '\n')

exists() กับ inherits

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

parent_e <- new.env(parent = emptyenv())
parent_e$shared <- 42
child_e  <- new.env(parent = parent_e)
# inherits=TRUE: finds shared in parent
cat('inherits TRUE:', exists('shared', envir = child_e, inherits = TRUE),  '\n')
# inherits=FALSE: only looks in child
cat('inherits FALSE:', exists('shared', envir = child_e, inherits = FALSE), '\n')

environmentName() และ parent.env()

environmentName(e) ส่งคืนชื่อของสภาพแวดล้อมในตัว ('R_GlobalEnv', 'package:base' เป็นต้น) สภาพแวดล้อมที่ผู้ใช้สร้างจะส่งคืน '' ส่วน parent.env(e) ส่งคืนออบเจ็กต์สภาพแวดล้อมแม่

e <- new.env(parent = globalenv())
cat('Name of e     :', environmentName(e), '\n')
cat('Parent of e   :', environmentName(parent.env(e)), '\n')
cat('Name of global:', environmentName(globalenv()), '\n')

ไวยากรณ์ $ สำหรับสภาพแวดล้อม

สภาพแวดล้อมรองรับไวยากรณ์ $ และ [[ เช่นเดียวกับรายการ สำหรับอ่านและเขียนการผูกชื่อ วิธีนี้มักสะดวกกว่า get()/assign() เมื่อต้องการเข้าถึงโดยตรงและทราบชื่อขณะเขียน

e <- new.env(parent = emptyenv())
e$pi_approx <- 3.14159
e[['e_approx']] <- 2.71828
cat('pi:', e$pi_approx, '\n')
cat('e :', e[['e_approx']], '\n')

rm() ในสภาพแวดล้อมที่ระบุ

rm('name', envir = e) ลบการผูกชื่อออกจากสภาพแวดล้อมที่ระบุ ซึ่งแตกต่างจากการลบตัวแปรส่วนกลาง เมื่อทำงานกับสภาพแวดล้อมที่กำหนดเอง คุณต้องระบุสภาพแวดล้อมอย่างชัดเจน

e <- new.env(parent = emptyenv())
e$keep <- 1
e$remove_me <- 99
cat('Before:', ls(envir = e), '\n')
rm('remove_me', envir = e)
cat('After :', ls(envir = e), '\n')

as.list() สำหรับถ่ายข้อมูลสภาพแวดล้อม

as.list(e) แปลงการผูกชื่อทั้งหมดในสภาพแวดล้อมเป็นรายการที่มีชื่อ ทำให้ตรวจสอบหรือทำให้เนื้อหาอยู่ในรูปแบบอนุกรมได้ง่าย ผลลัพธ์เป็นภาพสถานะ ณ ขณะนั้น การเปลี่ยนแปลงสภาพแวดล้อมในภายหลังจะไม่ปรากฏในรายการ

e <- new.env(parent = emptyenv())
e$x <- 10
e$y <- 20
e$z <- 30
bindings <- as.list(e)
cat('Class:', class(bindings), '\n')
cat('Length:', length(bindings), '\n')
str(bindings)

สภาพแวดล้อมเป็นตารางแฮช

ตัวเลือก hash = TRUE ใน new.env() (เป็นค่าเริ่มต้นเมื่อกำหนดสภาพแวดล้อมแม่) จะเปิดใช้การค้นหาโดยแฮช ทำให้การค้นหาชื่อมีความซับซ้อน O(1) จึงทำให้สภาพแวดล้อมขนาดใหญ่เร็วกว่ารายการอย่างมากเมื่อต้องเก็บคู่คีย์กับค่า

# Build a small key-value store
store <- new.env(hash = TRUE, parent = emptyenv())
keys   <- paste0('key_', 1:5)
values <- c(10, 20, 30, 40, 50)
for (i in seq_along(keys)) assign(keys[i], values[i], envir = store)
# Retrieve
cat('key_3 =', get('key_3', envir = store), '\n')
cat('All keys:', ls(store), '\n')

การคัดลอกกับการใช้สภาพแวดล้อมร่วมกัน

การกำหนดสภาพแวดล้อมให้กับตัวแปรใหม่ไม่ได้เป็นการคัดลอก สังเกตว่าตัวแปรทั้งสองอ้างอิงออบเจ็กต์เดียวกัน หากต้องการสภาพแวดล้อมที่เป็นอิสระต่อกัน ให้ใช้ as.list() แล้วจึงใช้ list2env() เพื่อสร้างสำเนาจริง

e1 <- new.env(parent = emptyenv())
e1$val <- 100
e2 <- e1          # reference, not a copy
e2$val <- 999
cat('e1$val:', e1$val, '\n')  # 999, modified via e2!

# True copy:
e3 <- list2env(as.list(e1), parent = emptyenv())
e3$val <- 0
cat('e1$val after e3 change:', e1$val, '\n')  # still 999

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

ฟังก์ชันใดใช้ตรวจสอบว่าชื่อถูกผูกไว้ในสภาพแวดล้อมหรือไม่ โดย ไม่ ค้นหาในสภาพแวดล้อมแม่

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

ประเด็นสำคัญสำหรับการสร้างและตรวจสอบสภาพแวดล้อม:

  • new.env(parent=e) สร้างสภาพแวดล้อมว่างใหม่ ส่วน hash=TRUE เหมาะสำหรับที่เก็บข้อมูลขนาดใหญ่
  • ใช้ assign('x', v, envir=e) และ get('x', envir=e) เพื่อเข้าถึงข้อมูลด้วยโปรแกรม
  • e$x และ e[['x']] ทำงานคล้ายตัวเข้าถึงรายการ
  • ls(envir=e) แสดงรายการชื่อ ส่วน exists('x', envir=e, inherits=FALSE) ใช้ตรวจสอบอย่างเคร่งครัด
  • as.list(e) แปลงข้อมูลทั้งหมดเป็นรายการ ส่วน list2env() ใช้สร้างกลับเป็นสภาพแวดล้อม
  • สภาพแวดล้อมเป็นออบเจ็กต์แบบอ้างอิง การกำหนดค่าจึงใช้ร่วมกัน ไม่ได้คัดลอก
config <- new.env(hash = TRUE, parent = emptyenv())
assign('host', 'localhost', envir = config)
assign('port', 5432L,       envir = config)
assign('db',   'mydb',      envir = config)
cat('Keys  :', ls(config), '\n')
cat('host  :', config$host, '\n')
cat('port  :', config$port, '\n')

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

บทเรียน “การสร้างและตรวจสอบ Environment” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “การสร้างและตรวจสอบ Environment”

ใช้ new.env(), environment(), ls() และ get() เพื่อทำงานกับ environment คุณปฏิบัติ R Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

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

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

บทเรียน “การสร้างและตรวจสอบ Environment” ใช้เวลานานแค่ไหน

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

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

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

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

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