Jestem nowicjuszem w R i jestem dość zdezorientowany użyciem zmiennych lokalnych i globalnych w R.
Czytałem kilka postów w Internecie, które mówią, czy używam =
lub <-
przypiszę zmienną w bieżącym środowisku, a dzięki temu <<-
mogę uzyskać dostęp do zmiennej globalnej, gdy jestem wewnątrz funkcji.
Jednak, jak pamiętam w C ++, zmienne lokalne pojawiają się za każdym razem, gdy deklarujesz zmienną w nawiasach {}
, więc zastanawiam się, czy to jest to samo dla R? A może tylko dla funkcji w R mamy pojęcie zmiennych lokalnych.
Zrobiłem mały eksperyment, który wydaje się sugerować, że same nawiasy to za mało, czy coś mi się nie podoba?
{
x=matrix(1:10,2,5)
}
print(x[2,2])
[1] 4
globalenv(); globalenv() %>% parent.env; globalenv() %>% parent.env %>% parent.env
,…Error: could not find function "%>%"
. Czy to inna forma zlecenia?require(magrittr)
. Jest to sposób stosowania funkcji po prawej stronie (x | f1 | f2 | f3
) zamiast po lewej stronie (f3( f2( f1( x ) ) )
).Odpowiedzi:
Zmienne zadeklarowane wewnątrz funkcji są lokalne dla tej funkcji. Na przykład:
wydaje następujący błąd:
Error: object 'bar' not found
.Jeśli chcesz stworzyć
bar
zmienną globalną, powinieneś zrobić:W tym przypadku
bar
jest dostępny z zewnątrz funkcji.Jednak w przeciwieństwie do C, C ++ i wielu innych języków, nawiasy nie określają zakresu zmiennych. Na przykład w następującym fragmencie kodu:
y
pozostaje dostępny poif-else
oświadczeniu.Jak dobrze powiesz, możesz także tworzyć środowiska zagnieżdżone. Możesz rzucić okiem na te dwa linki, aby zrozumieć, jak ich używać:
Tutaj masz mały przykład:
źródło
<-
wykonuje przypisanie w obecnym środowisku.Kiedy jesteś wewnątrz funkcji, R tworzy dla ciebie nowe środowisko. Domyślnie zawiera wszystko ze środowiska, w którym został utworzony, więc możesz również użyć tych zmiennych, ale wszystko, co stworzysz, nie zostanie zapisane w środowisku globalnym.
W większości przypadków
<<-
przypisze zmienne już w środowisku globalnym lub utworzy zmienną w środowisku globalnym, nawet jeśli jesteś wewnątrz funkcji. Jednak nie jest to takie proste. To, co robi, to sprawdzenie środowiska nadrzędnego pod kątem zmiennej o nazwie, która nas interesuje. Jeśli nie znajdzie go w twoim środowisku nadrzędnym, przechodzi do środowiska nadrzędnego środowiska nadrzędnego (w momencie tworzenia funkcji) i tam szuka. Kontynuuje w górę do środowiska globalnego i jeśli nie zostanie znaleziony w środowisku globalnym, przypisze zmienną w środowisku globalnym.To może zilustrować, co się dzieje.
Gdy po raz pierwszy drukujemy pasek, którego jeszcze nie
foo
wywołaliśmy, powinien nadal być globalny - to ma sens. Za drugim razem, gdy drukujemy, znajduje się w środkufoo
przed wywołaniem,baz
więc wartość „in foo” ma sens. Poniżej znajduje się, gdzie widzimy, co<<-
faktycznie robi. Następna wypisywana wartość to "in baz - przed << -", mimo że instrukcja print występuje po<<-
. Dzieje się tak, ponieważ<<-
nie wygląda w obecnym środowisku (chyba że jesteś w środowisku globalnym, w którym to przypadku<<-
zachowuje się tak<-
). Zatem wewnątrzbaz
wartości bar pozostaje „in baz - przed << -”. Kiedy już wywołamybaz
kopię wewnątrz bara,foo
zostanie zmieniona na "in baz", ale jak widzimy, globalnybar
pozostaje niezmieniony.bar
która jest zdefiniowana wewnątrz programu,foo
znajduje się w środowisku nadrzędnym podczas tworzenia,baz
więc jest to pierwsza kopia tego,bar
która<<-
widzi, a tym samym kopia, do której przypisuje. Nie<<-
jest to więc tylko bezpośrednie przypisywanie do środowiska globalnego.<<-
jest trudna i nie polecałbym jej używać, jeśli możesz jej uniknąć. Jeśli naprawdę chcesz przypisać do środowiska globalnego, możesz użyć funkcji przypisania i wyraźnie powiedzieć, że chcesz przypisać globalnie.Teraz zmieniam instrukcję
<<-
na przypisaną i możemy zobaczyć, jaki to ma skutek:Więc za każdym razem wypisujemy bar wewnątrz
foo
wartości "in foo" nawet po wywołaniubaz
. Dzieje się tak, ponieważassign
nigdy nawet nie rozważaliśmy kopiibar
wnętrza foo, ponieważ powiedzieliśmy mu dokładnie, gdzie szukać. Jednak tym razem wartość bar w środowisku globalnym została zmieniona, ponieważ wyraźnie tam przypisaliśmy.Teraz zapytałeś również o tworzenie zmiennych lokalnych i możesz to zrobić dość łatwo bez tworzenia funkcji ... Musimy tylko użyć
local
funkcji.źródło
Nieco bardziej w tym samym kierunku
wypisze "1"
Wydrukuje „20”
źródło