Temat: Model obiektowy w R

Witam. Wziąłem się na poważnie za naukę R i od jakiegoś czasu staram się rozgryźć jego model obiektowy, problem polega na tym, że kiepsko mi to wychodzi - wciąż nie rozumiem paru rzeczy.

Pozwólcie, że pokażę na przykładzie o co mi chodzi. Na razie abstrahujemy od wszystkich kwestii obliczeniowych...

Tworzymy nowy obiekt, na razie bez klasy:


pluto < - NULL
pluto$imie <- "pluto"
pluto$wiek <- 80


I ustalamy jego klasę:


class(pluto) <- "pies"


na razie klasa pies nie ma własnych metod - zadeklarujmy jakąś:


print.pies <- function(self) {
print(paste(self$name), "jest psem i ma", as.character(self$age), "lat"))
}


i spoko - przeciążyliśmy metodę print dla klasy "pies", print(pluto) działa tak, jakbyśmy chcieli.

Tylko paru rzeczy nie rozumiem - dlaczego kropka, która przy wszystkich innych identyfikatorach traktowana jest jako normalny znak, przy identyfikatorach funkcji oddziela nazwę przeciążanej metody od nazwy klasy...

Dlaczego nie mogę deklarować własnych metod dla określonych klas? Np:


nakarm.pies <- function(self) {
print(paste(self$name,"został nakarmiony i już nie jest głodny"))
}

nakarm(pluto)



I tutaj nagle dostaję informację o tym, że nie ma takiej funkcji jak nakarm.
Jak to działa? Czy w R możemy deklarować własne metody "od zera", dla własnych typów klas? O co chodzi z tą kropką?

Nie ukrywam, że model obiektowy w R mnie przeraża i kompletnie odbiega od tego, co widziałem do tej pory...
Wojciech Sobala

Wojciech Sobala Redaktor
statystyczny,
biostatystyk,
Instytut Medycyny
Pr...

Temat: Model obiektowy w R

Spójrz na przykład:

http://zoonek2.free.fr/UNIX/48_R/02.html#4

Temat: Model obiektowy w R

Dzięki, jakoś nie udało mi się wcześniej trafić na tę stronę. R jest chyba najbardziej niewdzięcznym googlowo narzędziem, ciężko znaleźć coś na jego temat, bo jego nazwa składa się tylko z jednej litery :)

Temat: Model obiektowy w R

Już pojąłem (:

Najpierw trzeba zadeklarować funkcję, wywołującą metodę, a potem ją przeciążyć metodą charakterystyczną dla danej klasy.

W sumie podejście do programowania obiektowego ciekawe, ale kompletnie nieintuicyjne. Nigdy nie spotkałem się z czymś takim.
Wojciech Sobala

Wojciech Sobala Redaktor
statystyczny,
biostatystyk,
Instytut Medycyny
Pr...

Temat: Model obiektowy w R

Proponuję jeszcze to:

http://www.ibm.com/developerworks/linux/library/l-r3.html
Michał Bojanowski

Michał Bojanowski socjolog, analityk

Temat: Model obiektowy w R

Paweł Sopel:
Tylko paru rzeczy nie rozumiem - dlaczego kropka, która przy wszystkich innych identyfikatorach traktowana jest jako normalny znak, przy identyfikatorach funkcji oddziela nazwę przeciążanej metody od nazwy klasy...

Dlaczego nie mogę deklarować własnych metod dla określonych klas? Np:


nakarm.pies <- function(self) {[/quote]> print(paste(self$name,"został nakarmiony i już nie jest [quote]głodny"))
}

nakarm(pluto)



I tutaj nagle dostaję informację o tym, że nie ma takiej funkcji jak nakarm.
Jak to działa? Czy w R możemy deklarować własne metody "od zera", dla własnych typów klas? O co chodzi z tą kropką?


Systemy obiektowe w R są zasadniczo dwa: S3 i S4. S3, ten który właśnie próbujesz jest bardzo prosty i tak naprawdę sprowadza się do konwencji nazywania funkcji z użyciem kropki: 'funkcja.klasa'. W tym sensie jest dokladnie tak jak piszesz, kropka jest normalnym znakiem, jest tylko w sposób szczególny interpretowana przez UseMethod() i NextMethod(). Jest to na pewno wada całego systemu S3. Można np. S3 i R nabić w niezłą butelkę np tak:


# nowa funkcja rodzajowa
read <- function(x) UseMethod("read")
# obiekt nowej klasy 'csv'
x <- structure("costam", class="csv")
x
[1] "costam"
attr(,"class")
[1] "csv"


I teraz,


# R interpretuje wszystkie ponizsze funkcje jako metody zdefiniowane dla 'read'
methods(read)
[1] read.csv read.csv2 read.dcf read.delim read.delim2
[6] read.DIF read.fortran read.ftable read.fwf read.socket
[11] read.table read.table.url

# I metody dla klasy 'csv' ktora stworzylem
methods(class="csv")
[1] read.csv

# takie cos wywoluje "pod spodem" read.csv
read(x)
Error in file(file, "rt") : cannot open the connection
In addition: Warning message:
In file(file, "rt") : cannot open file 'costam': No such file or directory


Oczywiście podobne sytuacje mogą się zdarzyć mimo woli nieswiadomego uzytkownika. Wniosek ogólny jest taki, żeby raczej nie używać kropek do innych celów niż do nazywania metod. A w sytuacji gdy tworzone klasy sa rzeczywiscie niestandardowe, np. pies ;), lepiej uzywac S4 choc wtedy kodowania jest nieco wiecej...Michał Bojanowski edytował(a) ten post dnia 16.08.10 o godzinie 20:08
Wojciech Sobala

Wojciech Sobala Redaktor
statystyczny,
biostatystyk,
Instytut Medycyny
Pr...

Temat: Model obiektowy w R

Dokument o klasach S4:

http://www.stat.auckland.ac.nz/S-Workshop/Gentleman/S4...Wojciech Sobala edytował(a) ten post dnia 16.08.10 o godzinie 22:46
Michał Bojanowski

Michał Bojanowski socjolog, analityk

Temat: Model obiektowy w R

I nieco więcej linków np tutaj

http://rwiki.sciviews.org/doku.php?id=tips:classes-s4Michał Bojanowski edytował(a) ten post dnia 17.08.10 o godzinie 00:04

Temat: Model obiektowy w R

Sick thing! Kto to wymyślił i po co? Czy R nie może przypominać jakiegoś normalnego języka programowania? :P
Michał Bojanowski

Michał Bojanowski socjolog, analityk

Temat: Model obiektowy w R

Paweł Sopel:
Sick thing! Kto to wymyślił i po co? Czy R nie może przypominać jakiegoś normalnego języka programowania? :P

Kliknąłem w "like" mimo, że wcale nie "like" ;)

Przepraszam, jeżeli włączył mi się "Yoda mode", ale kwestia jest nieco filozoficzna...

Jak rozumiem chodzi ci o to, że w "normalnych" językach metody są ściśle związane z definicją klasy. pies.nakram, pies.wyprowadz etc. W R oba systemy S3 i S4 są skoncentrowane bliżej funkcji (operacji na danych) niż klas (danych per se). Pomysł był taki (anno domini 1988), że analizując dane użytkownik ma w głowie jakąś ogólną idee co chce zrobić, "chcę narysować Y od X", "chce użyć modelu 'm' do predykcji na podstawie danych 'd'" etc., więc powinien widzieć po jednej funkcji dla każdej z tych czynności. Wybór faktycznej metody następuje pod maską; czy, np używamy 'predict' dla modelu 'glm', 'lm', 'gam', czy cokolwiek.

Inna sprawa to fakt, że S3 jest bardzo nieformalny. Sprowadza się do konwencji nazywania funkcji. W szczególności definiowane metody nie są nigdzie rejestrowane: nie jest budowana żadna baza funkcji generic i ich metod. Wszystko opiera się na leksykalnym przeczesywaniu Workspace w poszukiwaniu odpowiednio nazwanych funkcji. Co często prowadzi do debilizmów tak, jak w moim przykładzie powyżej.Michał Bojanowski edytował(a) ten post dnia 19.08.10 o godzinie 16:52
Wojciech Sobala

Wojciech Sobala Redaktor
statystyczny,
biostatystyk,
Instytut Medycyny
Pr...

Temat: Model obiektowy w R

Ostatnio spotkałem się z określeniem użytym przez programistę (innego języka skrypowego), który zainteresował się programowaniem w R: "hot shiet".

Ciekawe dlaczego R odniósł mimo wszystko taki sukces? Przypominam sobie jak próbowano rozpowszechnić Lisp-Stat, który jest roszerzeniem języka programowania ale nie odniósł takiego sukcesu jak R.
W tej chwili próbuje się rozwijać środowiska do analizy danych w oparciu o Pythona (SciPy+inne), Perla (PDL+inne), Incanter (Closure) ale na chwilę obecną R odskoczył pod względem liczby zaimplementowanych modeli. Dla programistów może najlepszy byłby ROOT, który ma interpreter języka C (CINT).Wojciech Sobala edytował(a) ten post dnia 20.08.10 o godzinie 08:32

Temat: Model obiektowy w R

Moje marzenie: R# (w R.NET) :]

konto usunięte

Temat: Model obiektowy w R

Wojciech Sobala:
Ciekawe dlaczego R odniósł mimo wszystko taki sukces?
Może dlatego, że to nie programiści głównie go używają ;).
Ja sporo pracowałem w R, a obiektów, metod czy innych klas ani razu nie użyłem (przynajmniej świadomie). Nigdy nie chciało mi się tego uczyć. Jeśli była potrzeba pisania zaawansowanych programów, to zlecenie szło do programistów, a oni mieli już swoje narzędzia. Kiedyś razem robiliśmy własną logistyczną w C z bibliotekami w Fortranie, ech czasy :).Tomasz S. edytował(a) ten post dnia 20.08.10 o godzinie 19:50
Michał Bojanowski

Michał Bojanowski socjolog, analityk

Temat: Model obiektowy w R

Tomasz S.:
Wojciech Sobala:
Ciekawe dlaczego R odniósł mimo wszystko taki sukces?
Może dlatego, że to nie programiści głównie go używają ;).

Dokładnie tak :) W każdym razie niezawodowi programiści R napisali. Z myślą o raczej interaktywnym używaniu. Jestem pewien, że nikt z "ojców-założycieli" nie przewidywał webowych interface'ów do R, wersjach serwerowych etc etc.....
Wojciech Sobala

Wojciech Sobala Redaktor
statystyczny,
biostatystyk,
Instytut Medycyny
Pr...

Temat: Model obiektowy w R

Z punktu widzenia użytkownika, który korzysta z R do analizy danych model obiektowy jest sprawą drugorzędną. Znajomość tego modelu może się przydać jedynie do wyciągnięcia pewnych wybranych wyników analizy.

Co do interaktywnego korzystania z R to największym minusem jest brak przyzwoitego edytora. Oczywiście istnieją narzędzia zewnętrzne Tinn-R, Npp, Eclipse i Emacs (który swoją drogą pod windows tylko raz udało mi się skonfigurować choć nie ma większych problemów pod Linuksem).

konto usunięte

Temat: Model obiektowy w R

Michał Bojanowski:
Tomasz S.:
Wojciech Sobala:
Ciekawe dlaczego R odniósł mimo wszystko taki sukces?
Może dlatego, że to nie programiści głównie go używają ;).

Dokładnie tak :) W każdym razie niezawodowi programiści R napisali.

A czy "niezawodowi programiści" pisali także Matlab'a i Octave'a?

konto usunięte

Temat: Model obiektowy w R

Wojciech Sobala:
Z punktu widzenia użytkownika, który korzysta z R do analizy danych model obiektowy jest sprawą drugorzędną.

To zależy od struktury danych i od problemu. Jeśli rzecz nie polega na analizie jednej próbki, to podejście obiektowe wydaje się niezwykle pomocne. Przez długi czas nie mogłem się do niego przekonać, ale teraz bez podejścia obiektowego w R nie ruszam z miejsca.
Fakt, że trzeba się trochę więcej napracować, ale możliwość zrobienia głupiego błędu jest praktycznie zerowa.
Znajomość tego modelu może się przydać jedynie do wyciągnięcia pewnych wybranych wyników analizy.
Co do interaktywnego korzystania z R to największym minusem jest brak przyzwoitego edytora. Oczywiście istnieją narzędzia zewnętrzne Tinn-R, Npp, Eclipse i Emacs (który swoją drogą pod windows tylko raz udało mi się skonfigurować choć nie ma większych problemów pod Linuksem).
Tu pełna zgoda.
Wojciech Sobala

Wojciech Sobala Redaktor
statystyczny,
biostatystyk,
Instytut Medycyny
Pr...

Temat: Model obiektowy w R

Mariusz Kozakiewicz:
Wojciech Sobala:
Z punktu widzenia użytkownika, który korzysta z R do analizy danych model obiektowy jest sprawą drugorzędną.

To zależy od struktury danych i od problemu. Jeśli rzecz nie polega na analizie jednej próbki, to podejście obiektowe wydaje się niezwykle pomocne. Przez długi czas nie mogłem się do niego przekonać, ale teraz bez podejścia obiektowego w R nie ruszam z miejsca.
Fakt, że trzeba się trochę więcej napracować, ale możliwość zrobienia głupiego błędu jest praktycznie zerowa.

Ja mam najczęściej do czynienia z jednokrotną analizą danych więc stąd moje wątpliwości. Ale jeżeli mógłbyś podać przykład takiego modelu obiektowego to byłbym bardzo zainteresowany (pewnie nie tylko ja). Nie musi to być kompletny kod ale jego zarys bez szczegółowych implementacji.

konto usunięte

Temat: Model obiektowy w R

Wojciech Sobala:
Mariusz Kozakiewicz:
Wojciech Sobala:
Z punktu widzenia użytkownika, który korzysta z R do analizy danych model obiektowy jest sprawą drugorzędną.

To zależy od struktury danych i od problemu. Jeśli rzecz nie polega na analizie jednej próbki, to podejście obiektowe wydaje się niezwykle pomocne. Przez długi czas nie mogłem się do niego przekonać, ale teraz bez podejścia obiektowego w R nie ruszam z miejsca.
Fakt, że trzeba się trochę więcej napracować, ale możliwość zrobienia głupiego błędu jest praktycznie zerowa.

Ja mam najczęściej do czynienia z jednokrotną analizą danych więc stąd moje wątpliwości. Ale jeżeli mógłbyś podać przykład takiego modelu obiektowego to byłbym bardzo zainteresowany (pewnie nie tylko ja). Nie musi to być kompletny kod ale jego zarys bez szczegółowych implementacji.


Jeśli chodzi o przykład sytuacji - przepraszam obrońców praw zwierząt:
1. Laboratorium badawcze ma wiele klatek.
2. W klatkach są zwierzaki różnej płci i wieku.
3. Zwierzaki uczestniczą w testach.
4. Wyniki testów mają być zapisane w plikach osobno dla każdego testu, dla każdej klatki klatki, dla każdego zwierzaka.

Ogólnie można takie przykłady mnożyć.
Oczywiście można zapytać: dlaczego nie napisać tego w c++ lub javie? Moim zdaniem PRZECIĘTNY BIOLOG nie poradzi sobie z obiektowym c i użyciem zaawansowanych bibliotek statystycznych. R jest dla takiego BIOLOGA idealny.

Obiektowy R nie jest taki straszny - polecam:
http://cran.r-project.org/doc/contrib/Genolini-S4tutor...

Temat: Model obiektowy w R

Temat wraca jak bumerang.

Mamy jakąś metodę...



nakarm <- function(self)
{
UseMethod("nakarm")
}

nakarm.pies <- function(self)
{
self$najedzony <- TRUE
}

class(pluto) <- "pies"
pluto$najedzony <- FALSE
nakarm(pluto)
print(pluto$najedzony) # FALSE !



problem polega na tym, że self w metodzie nakarm.pies jest w gruncie rzeczy kopią obiektu, dla którego została wywołana ta metoda a nie wskaźnikiem na ten obiekt, w związku z czym modyfikowanie obiektu przez metody wywoływane dla niego jest niemożliwe. Czy da się ten problem jakoś rozwiązać?



Wyślij zaproszenie do