Przykład 1: Funkcja jest obiektem, przypisanie funkcji o nazwie function() do zmiennej o nazwie funkcja1

Podobne dokumenty
Lab 9 Podstawy Programowania

JĘZYKI PROGRAMOWANIA Z PROGRAMOWANIEM OBIEKTOWYM. Wykład 6

Wykład 8: klasy cz. 4

4. Funkcje. Przykłady

Widoczność zmiennych Czy wartości każdej zmiennej można zmieniać w dowolnym miejscu kodu? Czy można zadeklarować dwie zmienne o takich samych nazwach?

Wykład 5: Klasy cz. 3

Rozdział 4 KLASY, OBIEKTY, METODY

Tablice (jedno i wielowymiarowe), łańcuchy znaków

Informatyka I: Instrukcja 4.2

1. Które składowe klasa posiada zawsze, niezależnie od tego czy je zdefiniujemy, czy nie?

PROE wykład 2 operacje na wskaźnikach. dr inż. Jacek Naruniec

Język C, tablice i funkcje (laboratorium, EE1-DI)

Wyrażenie include(sciezka_do_pliku) pozwala na załadowanie (wnętrza) pliku do skryptu php. Plik ten może zawierać wszystko, co może się znaleźć w

Wprowadzenie do programu Mathcad 15 cz. 1

Metody numeryczne Laboratorium 2

Podstawy programowania. Wykład Funkcje. Krzysztof Banaś Podstawy programowania 1

JAVAScript w dokumentach HTML (1) JavaScript jest to interpretowany, zorientowany obiektowo, skryptowy język programowania.

Podstawy programowania. Wykład PASCAL. Zmienne wskaźnikowe i dynamiczne. dr Artur Bartoszewski - Podstawy prograowania, sem.

1. Indeksy/indeksowanie : Do elementów wektora, list, macierzy czy ramek, można się odwołać na kilka sposobów.

W2 Wprowadzenie do klas C++ Klasa najważniejsze pojęcie C++. To jest mechanizm do tworzenia obiektów. Deklaracje klasy :

Skrypty i funkcje Zapisywane są w m-plikach Wywoływane są przez nazwę m-pliku, w którym są zapisane (bez rozszerzenia) M-pliki mogą zawierać

Języki programowania C i C++ Wykład: Typy zmiennych c.d. Operatory Funkcje. dr Artur Bartoszewski - Języki C i C++, sem.

> C++ wskaźniki. Dane: Iwona Polak. Uniwersytet Śląski Instytut Informatyki 26 kwietnia 2017

Wykład nr 3. Temat: Wskaźniki i referencje. Edward Morgan Forster

C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy WSKAŹNIKI KLASOWE

Mathcad c.d. - Macierze, wykresy 3D, rozwiązywanie równań, pochodne i całki, animacje

Interfejsy i klasy wewnętrzne

C++ - przeciążanie operatorów. C++ - przeciążanie operatorów. C++ - przeciążanie operatorów. C++ - przeciążanie operatorów

Podstawy programowania. Wykład 7 Tablice wielowymiarowe, SOA, AOS, itp. Krzysztof Banaś Podstawy programowania 1

Szablony klas, zastosowanie szablonów w programach

Rekurencja (rekursja)

Wskaźniki i dynamiczna alokacja pamięci. Spotkanie 4. Wskaźniki. Dynamiczna alokacja pamięci. Przykłady

Język C, tablice i funkcje (laboratorium)

Laboratorium nr 10. Temat: Funkcje cz.2.

Wykład 4: Klasy i Metody

Ok. Rozbijmy to na czynniki pierwsze, pomijając fragmenty, które już znamy:

Język C zajęcia nr 11. Funkcje

Wykład 3 Składnia języka C# (cz. 2)

Warsztaty dla nauczycieli

Podstawy programowania. Podstawy C# Tablice

Informatyka I. Klasy i obiekty. Podstawy programowania obiektowego. dr inż. Andrzej Czerepicki. Politechnika Warszawska Wydział Transportu 2018

Obliczenia iteracyjne

Wskaźniki a tablice Wskaźniki i tablice są ze sobą w języku C++ ściśle związane. Aby się o tym przekonać wykonajmy cwiczenie.

Zmienne, stałe i operatory

Laboratorium Wstawianie skryptu na stroną: 2. Komentarze: 3. Deklaracja zmiennych

Wskaźniki w C. Anna Gogolińska

2. Tablice. Tablice jednowymiarowe - wektory. Algorytmy i Struktury Danych

Podstawy programowania skrót z wykładów:

Blockly Kodowanie pomoc.

Wstęp do Programowania, laboratorium 02

Instytut Mechaniki i Inżynierii Obliczeniowej Wydział Mechaniczny Technologiczny Politechnika Śląska

Bloki anonimowe w PL/SQL

1. Wartość, jaką odczytuje się z obszaru przydzielonego obiektowi to: a) I - wartość b) definicja obiektu c) typ oboektu d) p - wartość

Programowanie - wykład 4

Aplikacje w środowisku Java

Materiał. Typy zmiennych Instrukcje warunkowe Pętle Tablice statyczne Funkcje Wskaźniki Referencje Tablice dynamiczne Typ string Przeładowania funkcji

Dekoratora używa się wstawiając linijkę zaczynającą się przed definicją dekorowanego obiektu (klasy czy funkcji).

Podstawy informatyki. Elektrotechnika I rok. Język C++ Operacje na danych - wskaźniki Instrukcja do ćwiczenia

Programowanie strukturalne i obiektowe. Funkcje

ZASADY PROGRAMOWANIA KOMPUTERÓW

Język C++ zajęcia nr 2

7. Pętle for. Przykłady

Przeciążanie operatorów

Argumenty wywołania programu, operacje na plikach

Układ równań liniowych

Wstęp do programowania

Część 4 życie programu

Uwagi dotyczące notacji kodu! Moduły. Struktura modułu. Procedury. Opcje modułu (niektóre)

Dodatkowo klasa powinna mieć destruktor zwalniający pamięć.

Programowanie obiektowe - 1.

Podstawy programowania. Wykład: 7. Funkcje Przekazywanie argumentów do funkcji. dr Artur Bartoszewski -Podstawy programowania, sem 1 - WYKŁAD

3. Instrukcje warunkowe

Konstruktory. Streszczenie Celem wykładu jest zaprezentowanie konstruktorów w Javie, syntaktyki oraz zalet ich stosowania. Czas wykładu 45 minut.

Wykład IV PASCAL - łańcuch znaków, - procedury i funkcje, - sortowanie bąbelkowe

10. Programowanie obiektowe w PHP5

Zmienne powłoki. Wywołanie wartości następuje poprzez umieszczenie przed nazwą zmiennej znaku dolara ($ZMIENNA), np. ZMIENNA=wartosc.

Informacje ogólne. Karol Trybulec p-programowanie.pl 1. 2 // cialo klasy. class osoba { string imie; string nazwisko; int wiek; int wzrost;

#include <iostream> using namespace std; void ela(int); int main( ); { Funkcja 3. return 0; }

Pakiety i interfejsy. Tomasz Borzyszkowski

Dziedziczenie. Tomasz Borzyszkowski

Zadeklarowanie tablicy przypomina analogiczną operację dla zwykłych (skalarnych) zmiennych. Może zatem wyglądać na przykład tak:

Listy, krotki, słowniki, funkcje

Funkcje i tablice. Elwira Wachowicz. 23 maja 2013

Funkcja pierwotna, całka oznaczona na podstawie funkcji pierwotnej

Obiektowy PHP. Czym jest obiekt? Definicja klasy. Składowe klasy pola i metody

Niezwykłe tablice Poznane typy danych pozwalają przechowywać pojedyncze liczby. Dzięki tablicom zgromadzimy wiele wartości w jednym miejscu.

C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy INNE SPOSOBY INICJALIZACJI SKŁADOWYCH OBIEKTU

Wprowadzenie w dziedziczenie. Klasa D dziedziczy klasę B: Klasa B klasa bazowa (base class), klasa D klasa pochodna (derived class).

Języki i techniki programowania Ćwiczenia 2

Funkcje są prawdopodobnie najważniejszą częścią każdego poważnego programu (w każdym języku programowania).

Algorytmy i język C++

Uniwersytet Zielonogórski Instytut Sterowania i Systemów Informatycznych. Ćwiczenie 3 stos Laboratorium Metod i Języków Programowania

TECHNOLOGIE INTERNETOWE WYKŁAD 6. JavaScript Funkcje i obiekty

1 Wskaźniki. 1.1 Główne zastosowania wskaźników

Lab 10. Funkcje w argumentach funkcji metoda Newtona. Synonimy nazw typów danych. Struktury. Tablice struktur.

Wstęp do programowania

JAVAScript w dokumentach HTML (1)

METODY KOMPUTEROWE W OBLICZENIACH INŻYNIERSKICH

Informacja o języku. Osadzanie skryptów. Instrukcje, komentarze, zmienne, typy, stałe. Operatory. Struktury kontrolne. Tablice.

Transkrypt:

Rachunek Prawdopodobieństwa i Statystyka lab 3. Kaja Gutowska (Kaja.Gutowska@cs.put.poznan.pl) 1. Funkcje: - Funkcje nie powinny korzystać ze zmiennych globalnych. - Funkcje powinny być możliwie krótkie. - Funkcje w R są traktowane jak zwykłe obiekty. - Nazwa funkcji nie jest związana z jej definicją, a tylko z nazwą zmiennej, w której funkcja jest zapamiętana. - Funkcje mogą zwracać wartości. Wynikiem funkcji jest wartość wyznaczona w ostatniej linii ciała funkcji lub można wykorzystać funkcję return(). - Do funkcji można przekazać argumenty, powinny być rozdzielone przecinkami. - R pozwala na podanie niepełnej, ale jednoznacznej nazwy argumentu. Oznacza to, że w przypadku długiej nazwy argumentów, można podać fragment nazwy, który jednoznacznie identyfikuje argument. Poczytaj o funkcji match.arg(). - Przykładowo mamy funkcję przyjmującą 1 argument: - Składnia: > funkcja <- function(liczba = 5) cat("wynik działania: ", liczba*2) > funkcja(li = 15) #nie trzeba podawać pełnej nazwy argumentu, zamiast "liczba" podano "li". function(argumenty){ instrukcje # jeśli w ciele funkcji mamy tylko jedną instrukcję to można pominąć klamry # argumenty to lista par składających się z nazwy argumentu i jego domyślnej wartości (co jest opcjonalne). Funkcja jest obiektem, przypisanie funkcji o nazwie function() do zmiennej o nazwie funkcja1 funkcja1 <- function(){ cat("dzisiejsza data") cat(format(sys.time(), "%A %B %C")) funkcja1() Przypisując do zmiennej funkcję, została utworzona zmienna typu funkcyjnego. Chcąc edytować ciało zmiennej należy wykorzystać funkcję edit() lub fix(): > edit(funkcja1)

2. Argumenty domyślne: - Definiując funkcję można określić domyślne wartości argumentów. W przypadku wywołania funkcji bez podania argumentów, wykorzystana zostanie wartość domyślna. - Funkcję można wywołać z dowolną kolejnością argumentów. Jeśli rezygnujemy z kolejności argumentów, należy pamiętać o podaniu nazwy, tak żeby było wiadomo, który argument jest wprowadzany. - W przypadku, gdy zdefiniowane są argumenty z wartościami domyślnymi to możemy je pominąć w wywoływaniu funkcji. - W funkcji można wywołać argumenty nadmiarowe, używając wielokropka " ". Argumenty nadmiarowe nie będą wykorzystane w ciele funkcji, ale mogą być przekazane dalej, w wywołaniach innych funkcji. - Można globalnie określić domyślne wartości dla pewnych argumentów, używając funkcji options(). - Pakiet Defaults pozwala na określenie domyślnej wartości dla argumentów wskazanej funkcji. #tworzymy wektor liczb > liczby <- c(5,4,3,7,10,2) #tworzymy funkcję, która wyświetli nam pewien zakres liczb z wektora #zdefiniowano argumenty domyślne > wyswietl <- function(wektor, do = 4, od = 1){ wektor[od:do] #wywołano funkcję z jednym argumentem, z wektorem liczb, bez określania zakresu > wyswietl(liczby) #wywołano funkcję z dwoma argumentami (wektor i do) > wyswietl(liczby, 5) #wywołano funkcję z dwoma argumentami (wektor i od) > wyswietl(liczby, od = 5) #wywołano funkcję ze zmienioną kolejnością argumentów > wyswietl(do=5, wektor = liczby) #wywołano funkcję z pominięciem argumentu do, ma zdefiniowaną wartość domyślną > wyswietl(liczby,, 2)

Przykład 2: Funkcja z nadmiarową ilością argumentów: > liczby <- c(5,4,3,7,10,2) > rysuj <- function(wektor, ile=3,...){ plot(wektor[1:ile],...) > rysuj(liczby, ile=5, lwd=3, type="l", col="red") 3 Funkcje anonimowe: - Funkcja, której argumentem jest inna funkcja, sposoby tworzenia: - Zdefiniowanie funkcji i przypisanie jej do zmiennej, a następnie przekazanie jej jako argument (w tym przypadku nie trzeba podawać nazwy zmiennej, bo nazwa nie ma żadnego znaczenia). - Można jako argument podać bezpośrednio ciało funkcji. Tym sposobem utworzono funkcję anonimową, czyli funkcję, która nie jest przypisana do żadnej zmiennej. Funkcja anonimowa nie ma nazwy. Przykład 1 - argumentem funkcji jest inna funkcja: > naszafunkcja <- function(x){ x^2 > sapply(c(2,4,6), naszafunkcja) Przykład 2 - użycie funkcji anonimowej: > sapply(c(2,4,6), function(x) x^2) 4. Przeciążanie funkcji: - Definiowanie funkcji polimorficznych czyli mechanizm przeciążania funkcji. - Przeciążanie funkcji oznacza, że funkcja dla określonych argumentów zachowuje się w określony sposób. - Nie każdą funkcję można przeciążyć. - Często przeciążanymi funkcjami są: plot(), anova(), print() itd. - Można sprawdzić czy zadeklarowane są jakieś przeciążone wersje funkcji lub czy istnieją przeciążone funkcje dla jakiej klasy - wykorzystując funkcję methods(). - Mechanizm przeciążania funkcji pozwala tworzyć obiekty określonej klasy i przeciążać dla nich podstawowe funkcje.

Przykład 1 - przeciążanie istniejącej funkcji plot(), która w ogólności służy do rysowania, aby w zależności od klasy pierwszego argumentu zachowywała się w określony sposób. Chcemy, aby dla argumentów o typie logicznym zamiast rysować wypisała wartość argumentu. - Jak to zrobić? Należy zdefiniować nową funkcję i przypisać ją do zmiennej o nazwie plot.typ (typ to nazwa klasy, dla której ta funkcja jest dedykowana np. logic). - Informacja dodatkowa: Wywołanie funkcji bez suffiksu.typ, ale z argumentem klasy typ spowoduje wywołanie funkcji z suffiksem.typ. Co oznacza to, że jeśli funkcja plot() jest polimorficzna, a obiekt wynik jest klasy summary to otrzymamy ten sam efekt pisząc plot(wynik) i plot.summary(wynik). - Deklarujemy funkcję o nazwie plot.logical, ale wywołujemy ją po prostu przez nazwę plot z argumentem logicznym: plot.logical<-function(obj){ cat(ifelse(obj,"true","false")) plot(1:10 < 5) Ważna informacja! Nie każda funkcja może być przeciążona. Jeśli chcemy, żeby R wiedział, że jakaś funkcja może być przeciążona, należy ją oznaczyć używając funkcji UseMethod(). Przykład 2: Niech funkcja rozmiar() wyznacza i przekazuje liczbę elementów w danym obiekcie, bez względu czy jest to wektor, macierz czy ramka danych. - 1 krok - definiujemy funkcję o nazwie rozmiar, która może być przeciążana: rozmiar <- function(x) UseMethod("rozmiar") - 2 krok - określamy domyślne zachowanie funkcji: rozmiar.default <- function(x) length(x) - 3 krok - określamy zachowanie dla konkretnych klas argumentów: rozmiar.character <- function(x) length(x) rozmiar.matrix <- function(x) dim(x)[1] * dim(x)[2] rozmiar.array <- function(x) prod(dim(x)) - 4 krok - wywołanie z różnymi argumentami: rozmiar(1:10) # argumentem jest wektor rozmiar(matrix(0,10,10)) # argumentem jest macierz

5. Funkcje a zasięg: Operatory przypisania wartości do zmiennej: ->,<-,=. Wyróżnić można jeszcze inne operatory przypisania: ->> i <<-. Różnica jest taka, że pierwsze trzy operatory (->, <-, =) przypisują wartość zmiennej o lokalnym zasięgu. Zatem użycie któregoś z wymienionych operatorów funkcji, zmienia wartość lokalnie w funkcji. W przypadku, operatorów (->>, <<-) jest to przypisanie wartości zmiennej o globalnym zasięgu, co oznacza, że zmiany są widoczne poza funkcją. > wartosc1 <- 1 > wartosc2 <- 1 > funkcja <- function(){ wartosc1 <-2 wartosc2 <<-2 cat(paste("wartość 1: ", wartosc1, "wartość 2: ", wartosc2, "\n")) #stan zmiennych globalnych: > cat(paste("wartość 1: ", wartosc1, "wartość 2: ", wartosc2, "\n")) #wywołanie funkcji, stan zmiennych lokalnych: > funkcja() #stan zmiennych globalnych() > cat(paste("wartość 1: ", wartosc1, "wartość 2: ", wartosc2, "\n")) 6. Funkcje a operatory: R umożliwia własne definiowanie operatorów, przez otoczenie znakiem % dowolnego ciągu znaków. Technicznie, operatory są zwykłymi funkcjami z różnicą w sposobie wywołania. > "%u%" <- function(a,b) a*b + a+b > 2 %u% 3 7. Leniwa i Gorliwa ewaluacja: - Leniwa ewaluacja: Dotyczy wszystkich funkcji w R. Wartości argumentów zdefiniowane w miejscu wywołania funkcji nie są wyznaczane dopóki ich wartość nie jest potrzebna. - Gorliwa ewaluacja: Argumenty funkcji są wyznaczane przed jej uruchomieniem (do funkcji trafiają wyniki ewaluacji argumentów).

Przykład leniwej ewaluacji: > f <- function(a, b = c^2) { c <- 1:a print(b) # "b" ma przypisaną wartość domyślną, którą jest wyrażenie z^2, # "c" jest określone wewnątrz funkcji, # w przestrzeni w której jest wywoływana funkcja, zmienna "c" może nie istnieć. Gdyby wartościowanie było gorliwe, to R zwróciłby błąd związany z brakiem wartości zmiennej "c". > f(6) # podano tylko pierwszy argument. Dlaczego nie został zgłoszony błąd? Wartość "b" jest wyznaczona na końcu ciała funkcji, w tym momencie jest znana wartość zmiennej "c". > f(6, 1:5) # gdy podamy oba argumenty funkcja działa poprawnie, zgodnie z oczekiwaniami. > f(6, c^2) # wystąpi błąd (object not found), zmienna "c" w wywołaniu znajduje się w innej przestrzeni nazw niż zmienna "c" wewnątrz funkcji. 8. Zarządzanie obiektami w przestrzeni nazw: - Przestrzeń nazw jest to zbiór symboli, do których przypisywane są wartości. - Przestrzeń nazw ma strukturę drzewa, na samej górze znajduje się przestrzeń nazw pusta - R_EmptyEnv, która jak nazwa wskazuje jest pusta i nie zawiera żadnego symbolu. - Wszystkie przestrzenie nazw (poza R_EmptyEnv), mają przestrzeń nadrzędną do której można się odwołać poprzez funkcję: parent.env() - Można wyróżnić główną przestrzeń nazw czyli.globalenv (tutaj znajdują się nazwy zmiennych określone jako globalne). - W przypadku tworzenia funkcji, tworzy się nowa przestrzeń nazw. Zmienne zdefiniowane wewnątrz funkcji nie są widziane poza funkcją. O takich zmiennych mówi się, że znajdują się w innej przestrzeni nazw. - Wewnątrz funkcji mamy możliwość odwołać się z zmiennych znajdujących się w tej funkcji, lub do zmiennych z nadrzędnych przestrzeni nazw. - R umożliwia zarządzanie przestrzeniami nazw, jedną z takich funkcji jest ls().

Przydatne funkcje: - Funkcja ls() i objects() wyświetla nazwy obiektów w aktualnej przestrzeni nazw. - Funkcja rm() usuwa z pamięci operacyjnej niepotrzebny obiekt. Podobne działanie jest związane z przypisaniem do niepotrzebnej zmiennej wartości NULL. Różnica jest taka, że rm() usuwa obiekt o podanej nazwie i zwalnia pamięć zajmowaną przez zmienną. Natomiast przypisanie NULL, zwalania pamięć, ale nazwa zmiennej zostaje w przestrzeni. - Funkcja save.image() zapisuje do pliku zmienne z aktualnej przestrzeni nazw. - Funkcja sessioninfo() pokazuje informacje o stanie środowiska R. Zadania: Zadania pod koniec zajęć prześlij na maila (Kaja.Gutowska@cs.put.poznan.pl) w postaci skryptu.r. Proszę nadać tytuł maila zgodnie z opisem: RPiS_Imię_Nazwisko_lab3 1. Napisz funkcję, która przyjmuje dwa argumenty: pierwszym jest wektor, a drugim dowolna liczba b. Program zwraca tylko te elementy wektora, które dzielą się bez reszty przez b. 2. Napisz funkcję, która wyznacza pierwiastki równania kwadratowego. Funkcja ta przyjmuje trzy argumenty: a, b i c 3. Napisz funkcję, która jako argument przyjmuje wektor 5 liczb i sortuje te liczby wykorzystując funkcję sort(). Następnie w funkcji wyświetl pierwsze 3 liczby (czyli 3 najmniejsze liczby z wektora 5-elementowego). Nie wykorzystuj funkcji return(). 4. Napisz funkcję, która jako argumenty przyjmuje wektor liczb. Funkcja ma zwrócić w wyniku 3 elementy najmniejsze i 3 elementy największe. Funkcja powinna obsłużyć przypadek, w którym podany wektor zawiera mniej niż 3 elementy. W takim przypadku funkcja powinna wyświetlić komunikat, że wektor jest za krótki. 5. Napisz przeciążoną funkcję, która jako pierwszy argument przyjmuje wektor lub macierz, a za drugi argument przyjmuje liczbę x. Niech funkcja dla wektora zwróci wektor pomnożony o x, a dla macierzy niech zwróci macierz pomnożoną przez x.