Temat: Zarządzanie złożonymi danymi w R
Miron Kołodziejczyk:
Chodziło mi wyłącznie o to aby nie zrzucać danych do csv,
Ależ właśnie we wspomnianym poście na początku wątku, na zrzucie pokazałem zastosowanie RODBC z wykorzystaniem sqlQuery:
> library(RODBC)
> con <- file("d:\\zapytanie.sql", open="r");
> pacjenci.sql <- paste(readLines(con), collapse="\n");
> close(con);
> con <- odbcConnect("GLTest");
> pacjenci.df <- sqlQuery(con, pacjenci.sql);
> odbcCloseAll();
Pokazałeś pewne zastosowanie offline, ale nawet ciekawsze byłoby zastosowanie tego na środowisku produkcyjnym, np. można by na bieżąco uaktualniać modele zachowań klientów, modele finansowe, itp. wraz z pojawiającymi się nowymi danymi w bazie.
I dokładnie tak to wykorzystuję od 2007 - w szeroko rozumianych systemach analiz danych:
1.
do złożonej walidacji danych. Wiadomo, że do walidacji typu "min/max", "należy do zbioru", "jest liczbą" nie potrzebuję nic więcej, niż standardowe walidatory ASP.NET, czy ew. jakaś prosta konstrukcja programistyczna. Ale zdarza się, że potrzebny jest "walidator kontekstowy", np. "delta check" w diagnostyce laboratoryjnej, czy jakiś zakres referencyjny, zależny od wyników historycznych i trzeba to określić jakimś modelem. Oczywiście mogę to zrobić w C#, ale jeśli mam wejść głębiej w statystykę, mogę wykorzystać do tego R. Byle walidacja nie dotyczyła każdego pola, bo "zajadę" serwer.
2.
do analiz przeczesujących. Analizy takie uruchamiane są w określonych sytuacjach,"podczas wejścia do modułu", albo co zadany interwał. Przeczesują zbiór danych w poszukiwaniu alarmujących kombinacji wartości parametrów klinicznych i alarmują operatora, wyświetlając listę takich pacjentów.
3.
do analiz na żądanie. Badacz otrzymuje listę analiz, jakie może wykonać na danych, a także panel definicji próby, gdzie może określić warunki za pomocą "wyklikania" odpowiednich ustawień, bądź specjalnego, uproszczonego metajęzyka (albo SQL bądź samej tylko klauzuli WHERE, jeśli go zna; znam badaczy, którzy uczyli się podstaw SQL właśnie do takich celów)
Schemat pracy to aplikacja eCRF (ankieta, formularz elektroniczne) napisana w ASP.NET albo .NET WinForms (oczywiście może być w dowolnym narzędziu - PHP, Java, CGI), SQL Server (lub inne bazy), Rscript.exe (o tym za chwilę) i wymiana informacji przez XML. Niestety, wymaga to dedykowanego serwera (Windows/Linux) z możliwością uruchamiania plików wykonywalnych. Jeśli jest to jakiś serwer stojący sobie u klienta, do którego jest pełen dostęp, to oczywiście nie ma z tym żadnego problemu. Gorzej, jak klient sam dzierżawi serwery i np. nie ma takiej akurat możliwości.
Poniżej zamieszczam nieco istotnych informacji prawnych na wypadek, gdyby ktoś zapragnął wykorzystywać R do takich celów komercyjnie i sprzedawać gotowy produkt analityczny lub oferować jego napisanie. Oczywiście w przypadku softu pisanego na własne potrzeby do własnej firmy nie ma problemu - GPL pozwala na takie komercyjne wykorzystanie "by nature". W biznesie zawsze warto mieć przemyślane kwestie licencyjne oprogramowania, by potem nie musieć się tłumaczyć po fakcie. Ignorantia iuris nocet.
------------------------------------------------------------
W zastosowaniach komercyjnych sprzedawanych innym podmiotom odradzam korzystanie ze StatConnectora oraz z R.NET ze względów licencyjnych. Jest to dość złożona sprawa. Otóż sam R jest na licencji GPL 2. Dziedziczy to po R.DLL, która jest na tej licencji. Oznacza to, że wszystko, co "linkuje" do R.exe/R.dll musi być również na tej licencji, a zatem jeśli dystrybuuję rozwiązanie programistyczne, muszę jednocześnie udostępnić źródła. StatConnector i R.NET, chociaż same są na licencji LGPL, to jednak linkują do R.DLL, "deklasując" się do GPL. Ja z kolei linkuję do nich. Zresztą - o czym dalej - gdyby nawet R nie było na GPL, to i tak miałbym problem, gdyby wykorzystał jakąkolwiek bibliotekę (np. car), która jest na licencji GPL, bo jest ona wykonywana w przestrzeni adresowej R.
Aby uniknąć problemów prawnych, muszę wykorzystać R tak, jak to przewiduje oficjalne FAQ do licencji GPL2, a więc komunikować się z R "na długość ręki", wywołując binarkę z parametrami i nie wymieniać z nią "dostatecznie złożonych struktur danych, by sugerowało to monolityczny produkt", sprawić, by mój produkt uruchamiał i działał bez zainstalowanego R i wreszcie zapewnić, by to klient zainstalował samodzielnie R (nie dystrybuować go). Mogę sobie natomiast wystawić taką usługę wdrożeniową, jak "przygotowanie środowiska pracy oprogramowania" i dodatkowo wycenić ;)
Stąd pomysł odpalania Rscript.exe --vanilla wraz ze skryptem, który przygotowuje w pewien sposób (uwaga, kolejna pułapka!) moja aplikacja, a następnie odbierać wyniki w postaci XMLa i obrazków (wykresy), a potem analizować XML i wyświetlać, albo wprost przetransformować go do postaci HTMLA szablonem XSLT.
Od razu tę samą metodę mogę zastosować pod Windowsem i Linuksem - tam też jest rscript. Tylko zamiast RODBC stosuję JDBC ze sterownikiem np. Oracle'a (Oracle można zainstalować na Linuksie).
Aby uniknąć wymiany złożonych struktur danych (niestety, nie istnieje definicja, jak należy rozumieć i czym mierzyć złożoność wymienianych struktur danych :/), przekazuję do R jedynie skrypt SQL, ewentualnie z jakimiś metadanymi, albo nawet.... nazwę pliku skryptu SQL, który R sobie wczyta. Podobnie w drugą stronę odbieram XMLa z wynikami.
Co do generowania skryptów dla R, to jest tutaj jeszcze jeden problem - otóż ja te skrypty musiałbym (przy dystrybucji softu) udostępniać. I to pomimo faktu, że skrypty wykonane za pomocą aplikacji GPL nie są przez tę aplikację "infekowane licencją". A to dlatego, że "skrypty odnoszące się do komponentów GPL również stają się GPL. A kiedy ma to miejsce? Kiedy użyjemy jednego z dziesiątek, jak nie setek pakietów R, który jest na licencji GPL :) Musiałbym kontrolować dosłownie każdą funkcję i strukturę (nawet być może data.frame) z każdego pakietu, z którego korzystam, bądź który jest ładowany automatycznie z pakietem, który akurat NIE jest GPL. Widać więc, że to się staje "niedeterministyczne". Dlatego skrypty trzeba generować z "kawałków kodu" i wg pewnego algorytmu, albo....... zgodzić się na ich udostępnienie. Pozostaje jeszcze kwestia taka, czy udostępnić je jedynie klientowi (pisane na zamówienie) i wtedy może nie być problemu, czy wszystkim, kto zechce, gdy ogłaszam się na stronie i oferuję wersję "demo".
Są także inne metody - np. napisanie adaptera, który komunikuje się z R.DLL przez R.NET czy StatConnector, a na zewnątrz wystawia webserwis lub w naszym własnym formacie po TCP/IP. Wtedy nie musimy mieć praw do uruchamiania exeków, wystarczy R.DLL + nasz webserwis. A z kolei obok stoi nasza aplikacja, która łączy się do tego serwera. Kluczem jest tutaj format komunikacji - gniazda, webserwisy, system plików (np. FTP).
Wszystkie te problemy znikają (czyli możemy spokojnie linkować do R.DLL), gdybyśmy nasz soft oferowali w modelu SAAS (software as a service), czyli wszystko dzieje się na naszych serwerach, a dane przesyłane są od klienta przez webservice, albo przez upload plików z danymi. Niestety - to też pociąga za sobą konsekwencje prawne: personalia pacjentów (musimy wymusić ich depersonalizację, co nie jest trywialne; pacjenta może definiować nawet unikalny obraz kliniczny! albo zgłosić bazę do GIODO), zabezpieczenie danych przez kradzieżą, uszkodzeniem (awaria serwera, bazy danych). Jest także kwestia, że gdy klient zechce, by usunąć wszystkie dane, trzeba tez usunąć je ze wszystkich backupów. Najlepiej kupić w takim wypadku miejsce w jakiś komercyjnym Data Center, co nie będzie tanie, ale daje nam to nie tylko święty spokój z licencjami lecz także obsługą informatyczną.
W tym przypadku nie następuje dystrybucja oprogramowania, tylko jego funkcjonalności. I dobrze, że R nie jest na licencji np. Affero, bo wtedy nawet dystrybucja funkcjonalności oprogramowania byłaby "zGiePeeLizowana".
No i wszystko do czasu, aż R nie zostanie objęty inną licencją. Owszem, można bazować na wersji np. 2.13, ale z biegiem czasu nowsze pakiety już się pod nią nie uruchomią.
Jest naprawdę dużo niuansów. Polecam dyskusję poświęconą OpenSource i GPL w
tym wątku (trzeba dołączyć do
grupy programistów .NET)
Oczywiście zawsze można skorzystać z komercyjnego S+ :]
Adrian Olszewski edytował(a) ten post dnia 18.12.11 o godzinie 17:14