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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- Environment ใน R คืออะไร
- กฎขอบเขตแบบเล็กซิคัล
- ขอบเขตส่วนกลางเทียบกับขอบเขตเฉพาะที่
- การสร้างและตรวจสอบ Environment