<-
ไม่มอบหมายงานในสภาพแวดล้อมปัจจุบัน
เมื่อคุณอยู่ในฟังก์ชัน R จะสร้างสภาพแวดล้อมใหม่สำหรับคุณ โดยค่าเริ่มต้นจะรวมทุกอย่างตั้งแต่สภาพแวดล้อมที่สร้างขึ้นเพื่อให้คุณสามารถใช้ตัวแปรเหล่านั้นได้เช่นกัน แต่สิ่งใหม่ที่คุณสร้างขึ้นจะไม่ถูกเขียนลงในสภาพแวดล้อมส่วนกลาง
ในกรณีส่วนใหญ่<<-
จะกำหนดให้กับตัวแปรที่มีอยู่แล้วในสภาพแวดล้อมส่วนกลางหรือสร้างตัวแปรในสภาพแวดล้อมส่วนกลางแม้ว่าคุณจะอยู่ในฟังก์ชันก็ตาม อย่างไรก็ตามมันไม่ค่อยตรงไปตรงมาเท่าไหร่ สิ่งที่ทำคือตรวจสอบสภาพแวดล้อมหลักสำหรับตัวแปรที่มีชื่อที่น่าสนใจ หากไม่พบในสภาพแวดล้อมพาเรนต์ของคุณระบบจะไปที่พาเรนต์ของสภาวะแวดล้อมพาเรนต์ (ณ เวลาที่สร้างฟังก์ชัน) และดูที่นั่น มันยังคงขึ้นอยู่กับสภาพแวดล้อมทั่วโลกและหากไม่พบในสภาพแวดล้อมส่วนกลางก็จะกำหนดตัวแปรในสภาพแวดล้อมส่วนกลาง
สิ่งนี้อาจแสดงให้เห็นถึงสิ่งที่เกิดขึ้น
bar <- "global"
foo <- function(){
bar <- "in foo"
baz <- function(){
bar <- "in baz - before <<-"
bar <<- "in baz - after <<-"
print(bar)
}
print(bar)
baz()
print(bar)
}
> bar
[1] "global"
> foo()
[1] "in foo"
[1] "in baz - before <<-"
[1] "in baz - after <<-"
> bar
[1] "global"
ในครั้งแรกที่เราพิมพ์แถบเรายังไม่ได้เรียกfoo
มันจึงควรจะเป็นแบบโกลบอล - นี่ก็สมเหตุสมผลดี ครั้งที่สองที่เราพิมพ์ด้านในfoo
ก่อนที่จะเรียกbaz
ค่า "in foo" จึงเหมาะสม ต่อไปนี้เป็นที่ที่เราจะเห็นสิ่งที่<<-
กำลังทำอยู่ ค่าถัดไปที่พิมพ์คือ "in baz - before << -" แม้ว่าคำสั่งพิมพ์จะมาหลัง<<-
. นี่เป็นเพราะ<<-
ไม่ได้ดูในสภาพแวดล้อมปัจจุบัน (เว้นแต่คุณจะอยู่ในสภาพแวดล้อมทั่วโลกซึ่งในกรณีนี้<<-
จะเป็นเช่นนั้น<-
) ดังนั้นภายในbaz
ค่าของแท่งจะเป็น "in baz - before << -" เมื่อเราเรียกbaz
สำเนาของแถบด้านในของfoo
gets เปลี่ยนเป็น "in baz" แต่อย่างที่เราเห็น global bar
ไม่เปลี่ยนแปลงbar
ที่กำหนดไว้ภายในfoo
อยู่ในสภาพแวดล้อมพาเรนต์เมื่อเราสร้างbaz
ดังนั้นนี่คือสำเนาแรกของbar
ที่<<-
เห็นและสำเนาที่กำหนดให้ ดังนั้นจึง<<-
ไม่ใช่แค่การกำหนดให้กับสภาพแวดล้อมทั่วโลกโดยตรง
<<-
เป็นเรื่องยุ่งยากและฉันจะไม่แนะนำให้ใช้หากคุณสามารถหลีกเลี่ยงได้ หากคุณต้องการกำหนดให้กับสภาพแวดล้อมส่วนกลางจริงๆคุณสามารถใช้ฟังก์ชันกำหนดและบอกอย่างชัดเจนว่าคุณต้องการกำหนดทั่วโลก
ตอนนี้ฉันเปลี่ยน<<-
เป็นคำสั่งมอบหมายและเราสามารถดูว่ามีผลอย่างไร:
bar <- "global"
foo <- function(){
bar <- "in foo"
baz <- function(){
assign("bar", "in baz", envir = .GlobalEnv)
}
print(bar)
baz()
print(bar)
}
bar
#[1] "global"
foo()
#[1] "in foo"
#[1] "in foo"
bar
#[1] "in baz"
ดังนั้นทั้งสองครั้งที่เราพิมพ์แถบภายในfoo
ค่าจึงเป็น "in foo" แม้ว่าจะโทรbaz
แล้วก็ตาม นี่เป็นเพราะassign
ไม่เคยพิจารณาสำเนาของbar
inside of foo ด้วยซ้ำเพราะเราบอกว่าจะดูตรงไหน อย่างไรก็ตามในครั้งนี้ค่าของแท่งในสภาพแวดล้อมทั่วโลกมีการเปลี่ยนแปลงเนื่องจากเรากำหนดไว้ที่นั่นอย่างชัดเจน
ตอนนี้คุณถามเกี่ยวกับการสร้างตัวแปรในพื้นที่และคุณสามารถทำได้ค่อนข้างง่ายเช่นกันโดยไม่ต้องสร้างฟังก์ชัน ... เราต้องใช้local
ฟังก์ชัน
bar <- "global"
# local will create a new environment for us to play in
local({
bar <- "local"
print(bar)
})
#[1] "local"
bar
#[1] "global"
globalenv(); globalenv() %>% parent.env; globalenv() %>% parent.env %>% parent.env
, …