Ta strona wykorzystuje ciasteczka ("cookies") w celu zapewnienia maksymalnej wygody w korzystaniu z naszego serwisu. Czy wyrażasz na to zgodę?

Czytaj więcej
< All Topics
Print

Instrukcja przypisania i obiekty

Literały

W matematyce definiując np. funkcję liniową jako y=ax+b operuje się parametrami (są to litery a i b za które można podstawić dowolne liczby). W informatyce dość podobnie używa się zastępczych nazw, tylko, że liter alfabetu jest za mało dla potrzeb większości programów. Dlatego też stosuje się w miejsce parametrów tak zwane literały (zestawy liter, cyfr i innych znaków). Ten literał jest wtedy wykorzystywany w różnych instrukcjach w zastępstwie wartości, jaka się za nim kryje. Literałami nie mogą być słowa, służące do pisania instrukcji języka programowania – tzw. słowa kluczowe. Ich używanie w zastępstwie jakiś liczb, znaków i bardziej złożonych struktur mogłoby doprowadzić do niemożliwości zinterpretowania pewnych instrukcji przez komputer.

W R literałem może być dowolny zestaw liter i cyfr oraz znaków “.” i “_”, zaczynający się od litery. Słowami kluczowymi, których nie można użyć jako literałów, są:

Słowa kluczowe R:

if
else
repeat
while
function
for
in
next
break
TRUE
FALSE
NULL
Inf
NaN
NA
NA_integer_
NA_real_
NA_complex_
NA_character_

 

W języku R literały różniące się wielkością choćby jednej z liter traktowane są jako różne.

Literałom przypisuje się liczby, znaki, teksty a także funkcje, opcje funkcji i bardziej złożone obiekty. Są nazwami tych obiektów, ale kryje się zawsze za nimi konkretna wartość.

Instrukcja przypisania

Przypisanie literałom jakiejś liczby, znaku, tekstu lub innej wielkości jest instrukcją. Jest to najprostsza z instrukcji informatycznych obecna we wszystkich programach komputerowych, we wszystkich językach programowania.

Instrukcję przypisania w nowszych wersjach R można wykonać na cztery sposoby:

> assign("a",pi)
> a
[1] 3.141593
> x=pi/2
> y<-pi/2
> x+y
[1] 3.141593
> z<--pi/2
> x+z
[1] 0
> pi->b
> b
[1] 3.141593

 

W starszych wersjach R instrukcja przypisania była realizowana tylko przez dwuznak “<-“, gdy to co z prawej przypisywano literałowi z lewej lub “->” gdy to co z lewej przypisywano literałowi z prawej. W nowszych wersjach takie sposoby przypisania także istnieją, ale występuje też znak “=”, który zastępuje symbol “<-“. Warto przy tym wiedzieć, że symbol <- dominuje nad symbolem relacji logicznej < z liczbą ujemną po prawej stronie.

> x=0
> x<-2
> x
[1] 2
> x=0
> x< -2
[1] FALSE
> x<(-2)
[1] FALSE

 

Generalnie w R liczba spacji między elementami składni nie odgrywa większej roli. Nie wolno jednak wkładać spacji w środek literału. Natomiast tworząc instrukcje bez spacji, typu x=2, język R interpretując je, dokłada automatycznie spacje wydzielając wyrażenia zdefiniowane w jego składni, a następnie sprawdza poprawność wyrażenia. Stąd są przypadki, takie jak powyżej, gdy brak spacji powoduje błędną interpretację wyrażenia.

W jednej linijce można przypisać wartości kilku literałom, pod warunkiem, że instrukcje te przedzieli się średnikiem:

> imie="Weronika"; wiek=3; wzrost=111
> imie
[1] "Weronika"
> wiek
[1] 3
> wzrost
[1] 111

 

W polskiej wersji R w literałach używać można polskich liter wprowadzanych tak, jak ustawiono to w systemie operacyjnym. Nie oznacza to jednak, że polecam stosowanie polskich liter w programach R. Prawie zawsze sprawia to różne kłopoty przy zmianach wersji programu oraz korzystaniu z tego kodu na innych komputerach.

> ąęśćźż=345
> sqrt(ąęśćźż)
[1] 18.57418

 

Po przypisaniu jakiemyś literałowi określonej wartości trzeba w nowej linijce napisać nazwę (czyli użyty literał), żeby zobaczyć te wartość. Można to zrobić od razu obejmując całą instrukcje przypisania nawiasem okrągłym.

> x=sqrt(55.5)
> x
[1] 7.449832
> (x=sqrt(55.5))
[1] 7.449832

Jest to przydatne wtedy, gdy utworzyć obiekt i jednocześnie zobaczyć jego wartość.

 

Obiekty

Literały, którym przypisano różne wartości stają się obiektami R. Należy przy tym wiedzieć, że to co w R nazwano obiektem, w innych językach programowania obiektem nie jest. Obiekty w programach takich jal C++, Python i Paskal definiuje sie inaczej. Jednak w R zapamiętując obszar roboczy, zapamiętujemy także wszystkie obiekty zdefiniowane w danej sesji, czyli literały i wartości jakie się pod nimi kryją. Po dłuższej sesji w R takich obiektów może być bardzo dużo i nie wszystkie są potrzebne. Listę obiektów wyświetlimy za pomocą funkcji ls(). Funkcję tę można wywołać klikając na “Różne” (“Misc”) i wybierając z menu “Pokaż wszystkie obiekty” (“List object”). Gdy wszystkie obiekty są niepotrzebne można je usunąć klikając na “Różne” (“Misc”) i na “Usuń wszystkie obiekty” (“Remove all objects”). Można też wpisać w konsoli rm(list=ls(all=TRUE)). Usunięcie jednego z istniejących obiektów może być wykonane za pomocą funkcji rm(“nazwa_obiektu”).

> # funkcja ls()
> ls()
[1] "a" "pi" "T" 
> # funkcja rm()
> rm(list=ls(all=TRUE))
> ls()
character(0)
> a=1
> b="1"
> c=as.logical(1)
> ls()
[1] "a" "b" "c"
> rm("a")
> ls()
[1] "b" "c"

 

Po zobaczeniu, jakie obiekty są zdefiniowane w danej sesji, można sprawdzić, czy dobrze je zapamiętano używając funkcji logicznych. Przykładowo:

> x=-5.4; imie="Gosia"; warunek=x<0
> imie=="Anna"
[1] FALSE
> x<(-1)
[1] TRUE
> warunek==TRUE
[1] TRUE

 

Innym sposobem zorientowania się, co kryje się za danymi literałami jest zastosowanie funkcji mode(), typeof(), class() lub str().

> a=3
> b=a>-1
> a; b
[1] 3
[1] TRUE
> mode(a); mode(b)
"numeric"
"logical"
> typeof(a); typeof(b)
"double"
"logical"
> class(a); class(b)
"numeric"
"logical"
> str(a); str(b)
num 3
logi TRUE

 

W podanym przykładzie używanie tych funkcji wydaje się bezsensowne, bo łatwiej jest po prostu wyświetlić, co kryje się za literałem a. Jednak równie krótkie nazwy można nadawać obiektom bardzo złożonym, których nie da się całkowicie wyświetlić w konsoli. Wtedy pokazane funkcje okazują się bardzo przydatne.

Utworzone obiekty są pamiętane, dopóki nie wyłączy się programu R. Podczas wyłączania program pyta się, czy zapamiętać obszar roboczy. Gdy wyrazimy zgodę, w katalogu roboczym pojawi się ikonka z podpisem .RData. Nazwę jej można wprowadzić przed kropką w systemie operacyjnym bez zmiany właściwości tego wejścia do R. Możemy klikając na nią uruchomić R i będą w nim zapisane wszystkie obiekty utworzone podczas ostatniej sesji (i te, które były wcześniej). Jeżeli w kolejnych sesjach użyjemy takiego samego literału dla nowego obiektu, stary obiekt zostanie zmazany. Warto przy tym wiedzieć, że standardowo bieżącym katalogiem R jest folder “Dokumenty” (“Moje dokumenty”), a można go zmienić na dowolny inny wybierając z górnego menu słowo “Plik” i z rozwinięcia hasło “Zmień katalog”. Ponadto przed zamknięciem R można wykonać w konsoli funkcję save.image(“Moja_nazwa.RData”), gdzie za Moja_nazwa można wstawić cokolwiek, co może być nazwą pliku w danym systemie operacyjnym. Pozwala to na tworzenie własnych wejść do R ze swoimi obiektami.

> n.skunksow=50
> save.image("skunks.RData")
>

 

Wykonanie powyższego kodu spowoduje pojawienie się w katalogu roboczym ikonki o nazwie skunks.R, a jej aktywacja spowoduje uruchomienie się R, w którym jest obiekt o nazwie n.skunksow i ma on wartość 50.

Zasady przypisywania wartości literałom

Wiele nazw skonstruowanych zgodnie z definicją literału jest zrozumiałych dla R od samego początku. Są to nazwy funkcji, stałych liczbowych i obiektów dostępnych w pakietach podstawowych (dostępnych bez wywołania nazwy pakietu) i pakietach standardowo instalowanych lub zainstalowanych dodatkowo przez użytkowników (dostępnych po słowie require nazwa pakietu). Ponadto użytkownik wymyślając na poczekaniu jakąś nazwę i przypisując jej liczbę, tekst, wartość logiczną lub jakiś bardziej złożony obiekt może użyć literału już wykorzystanego przez kogoś dla nazwy czegoś innego. Nie prowadzi to do konfliktu. Operując konfliktowym literałem określono w R następującą hierarchię przypisywania mu określonej wartości:

  1. Jeżeli literał występuje w katalogu obiektów utworzonych przez użytkownika – przypisana jest mu wartość użytkownika.
  2. Jeżeli literał nie występuje w katalogu obiektów użytkownika, ale występujących w pakietach dodatkowych – przypisana jest mu wartość tego pakietu, który był wywołany funkcją require najpóźniej.
  3. Jeżeli literał nie występuje w katalogu obiektów użytkownika i nie występujących w pakietach dodatkowych, ale jest w pakietach standardowych – przypisana jest mu wartość z pakietu standardowego.
  4. Jeżeli literał nie występuje w katalogu obiektów użytkownika i nie występujących w pakietach dodatkowych i standardowych, pojawia się komunikat, że nie ma takiego obiektu.
> pi
[1] 3.141593
> cos(pi)
[1] -1
> pi=7
> cos(pi)
[1] 0.7539023

 

Literały oznaczające nazwy funkcji (matematycznych, tekstowych, logicznych i wszystkich innych zdefiniowanych w R) pamiętane są wraz z informacją, że są to funkcje i występuje po ich nazwie nawias otwierający. Zatem, gdy takiej nazwie przypiszemy jakiś obiekt nie będący funkcją – nie dojdzie do konfliktu.

> sin(7)
[1] 0.6569866
> sin=7
> sin(sin)
[1] 0.6569866

 

Komunikaty o braku obiektu lub funkcji o danej nazwie wyglądają następująco:

> abrakadabra
BŁĄD: nie znaleziono obiektu 'abrakadabra'
> abrakadabra(3)
BŁĄD: nie udało się znaleźć funkcji 'abrakadabra' 

 

Zarządzanie literałami w R umożliwia stosowanie nazw wszystkich, jakie można sobie wymyślić (poza słowami kluczowymi), nie uzyskując komunikatów o błędzie ani błędnych działań. Jeżeli jednak chcemy wrócić do standardowych wartości – należy obiekt o konfliktowej nazwie usunąć z listy zapisanych obiektów.

> pi=7
> cos(pi)
[1] 0.7539023
> rm("pi")
> cos(pi)
[1] -1

 

Jest to także powód, by czyścić katalog własnych obiektów z niepotrzebnych nazw, a te obiekty, które chce się zapamiętać – trzymać w wejściach do R utworzonych funkcją save.image().

Tags:
Spis treści