<-
mevcut ortamda atama yapar.
Bir fonksiyonun içindeyken, R sizin için yeni bir ortam yaratır. Varsayılan olarak, oluşturulduğu ortamdaki her şeyi içerir, böylece bu değişkenleri de kullanabilirsiniz, ancak oluşturduğunuz yeni hiçbir şey küresel ortama yazılmayacaktır.
Çoğu durumda <<-
, halihazırda global ortamda bulunan değişkenlere atanacak veya bir fonksiyonun içinde olsanız bile global ortamda bir değişken oluşturacaktır. Ancak, bu kadar kolay değil. Yaptığı şey, ilgili adı olan bir değişken için ana ortamı kontrol etmektir. Üst ortamınızda bulamazsa, üst ortamın üst ortamına (işlevin oluşturulduğu anda) gider ve oraya bakar. Küresel ortama doğru devam eder ve küresel ortamda bulunmazsa değişkeni küresel ortamda atar.
Bu neler olup bittiğini gösterebilir.
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
Henüz aramadığımız çubuğu ilk kez yazdırdığımızda, bu hala küresel olmalı - bu mantıklı. İkinci kez foo
çağırmadan önce içine yazdırdığımızda baz
"in foo" değeri mantıklıdır. Aşağıdakiler <<-
aslında ne yaptığını gördüğümüz yerdir . Print ifadesi. 'Den sonra gelse de yazdırılan bir sonraki değer "baz - önce << -" dir <<-
. Bunun nedeni <<-
, mevcut ortama bakmamasıdır (küresel ortamda olmadığınız sürece bu durumda <<-
davranır <-
). Yani baz
bar değerinin içi "baz - << - öncesi" olarak kalır. baz
Barın içindeki kopyası dediğimizde foo
"bazda" olarak değiştirilir ama gördüğümüz gibi global bar
değişmez.bar
içinde tanımlanırfoo
Yarattığımız zaman ebeveyn ortamında olduğu baz
bu ilk kopyasıdır böylece bar
o <<-
görür ve böylece atar kopyalayın. Yani <<-
doğrudan küresel ortama atanmak değil.
<<-
aldatıcıdır ve önleyebiliyorsanız kullanmanızı tavsiye etmem. Gerçekten global ortama atamak istiyorsanız, atama işlevini kullanabilir ve genel olarak atamak istediğinizi açıkça söyleyebilirsiniz.
Şimdi <<-
, atama ifadesini değiştiriyorum ve bunun hangi etkiye sahip olduğunu görebiliriz:
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"
Yani her iki seferde foo
de değerin içine bar yazdırırız , çağırdıktan sonra bile "in foo" olur baz
. Bunun nedeni , foo'nun içi assign
kopyasını hiç düşünmemiş bar
olmamızdır çünkü ona tam olarak nereye bakacağımızı söylemiştik. Ancak, bu sefer global ortamdaki bar değeri değiştirildi çünkü oraya açıkça atamıştık.
Şimdi ayrıca yerel değişkenler oluşturmayı da sordunuz ve bunu oldukça kolay bir şekilde bir işlev oluşturmadan da yapabilirsiniz ... Sadece local
işlevi kullanmamız gerekiyor .
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
,…