niedziela, 14 grudnia 2014

One R to rule them all

Problem

Dzisiejszy post jest konieczny do przejścia do następnych części ciągu wpisów na temat web-scrapingu. W kolejnych artykułach pojawią się treści, w których wykorzystywać będziemy poniższe rozwiązanie. Jako, że dzisiejsza treść jest związana nie tylko z web-scrapingiem, dlatego może być traktowana jako osobny byt.
Nie jest żadną tajemnicą, że R nie jest samowystarczalny. Większość mistrzów danych wykorzystuje rozmaite biblioteki napisane w takich językach jak Java, C, a R używa jako narzędzie, które wiąże koniec z końcem.

Nie oznacza to jednak, że ktoś korzystający z "obcej" biblioteki musi umieć programować w języku jej pochodzenia. Czytelnicy, którzy przebrnęli przez 1 cz. serii o web-scrapingu świadomie bądź nieświadomie skorzystali za pomocą R z zewnętrznej biblioteki Selenium. RSelenium pełni rolę nakładki, która steruje pracą Selenium 2.0. Gdyby jednak pakiet RSelenium nie istniał, nie oznaczałoby jeszcze, że nie byłaby możliwa komunikacja z Selenium 2.0 - Moglibyśmy, z tą różnicą, że byłoby to bardziej pracochłonne. Wiele pakietów dostępnych w R zostało napisanych jako swoiste API do zewnętrznych bibliotek, co jest sytuacją często spotykaną nie tylko w Naszym środowisku. R może również komunikować się z systemem operacyjnym za pomocą poleceń system(), shell() umożliwiając wykonanie poleceń tj. zamknięcie systemu, odpalenie dowolnej aplikacji, kopiowanie plików itd.
Poniżej kilka przykładowych poleceń
Jak widać uruchomienie dowolnego programu staje się dziecinnie proste, a R może służyć Nam za dyspozytornię poleceń systemowych. W powyższej ramce zademonstrowano jak działają polecenia systemowe, które są wysyłane z R, a wykonywane przez konsolę systemu operacyjnego. W ostatnim przykładzie przekazano polecenie systemowe do osobnego okna wiersza poleceń, natomiast w pozostałych przykładach wiersz poleceń zwraca wartości do konsoli R. Komendy te mogą dotyczyć każdego programu, a co ważne można za ich pośrednictwem przenosić różne argumenty na przykład: Uruchomić skrypt R, którego wynik przekazywany jest za pośrednictwem systemu operacyjnego do Pythona, a potem z powrotem do R. Takie rozwiązanie choć nie jest najładniejszą formą budowania aplikacji jest bardzo prostym rozwiązaniem, które przynajmniej Ja dotychczas z powodzeniem wykorzystywałem.


Rozwiązanie
Uruchamianie R, jak i innej aplikacji, z której będziemy chcieli korzystać za pomocą systemowego wiersza poleceń/terminala musi być uproszczone do minimum. Zamiast wpisywania całej ścieżki dostępu do programu, o wiele łatwiej byłoby wpisanie po prostu "R", "python", "java", "cokolwiek". Umożliwią to Nam zmienne środowiskowe. Aby stworzyć zmienną środowiskową klikamy prawym przyciskiem na "Mój Komputer">Właściwości>Zaawansowane Ustawienia Systemu>Zaawansowane>Zmienne Środowiskowe. W oknie Zmiennych Systemowych edytujemy "Path", dodając ścieżkę do folderu, w którym znajduje się aktualna wersja R, oddzielając od pozostałych ścieżek średnikiem. Klikamy Ok i gotowe [Instrukcja na Ilustracji 1]. Alternatywnie można tą samą operację wykonać za pośrednictwem wiersza poleceń, wysyłając polecenie znajdujące się pod Ilustracją 1. Gdy już to zrobimy, testujemy Nasze dokonanie w konsoli [Ilustracja 2.]

Ilustracja 1. Tworzenie nowej zmiennej środowiskowej




Ilustracja 2.Uruchomienie R w konsoli systemowej


Gdybyśmy chcieli odwoływać się w ten sposób do innych aplikacji (np. wspominany wcześniej python), możemy z powodzeniem wykonać powyższe operacje dodając do zmiennych środowiskowych ścieżki odpowiednich folderów (np. C:/python34).
Poprzednie przykłady pokazywały tylko wywoływanie komend bez przekazywania argumentów między R i systemem. Dla zrozumienia sedna dzisiejszego problemu warto zapoznać się z poniższym przykładem. Poniżej zademonstrowane zostanie rozwiązanie wykorzystujące świeżo utworzoną zmienną środowiskową oraz funkcję commandArgs() przechwytującą przekazywane argumenty z wiersza poleceń do uruchamianej sesji R. W ten sposób polecenia system() i commandArgs() są kompletnym zestawem narzędzi do wymiany informacji między R i systemem. Wspomniany wcześniej python korzysta z bliźniaczego zestawu - subprocess.Popen i sys.argv - co w sumie daje możliwość swobodnego przekazywania wyników z R do Pythona (i na odwrót) za pośrednictwem systemu operacyjnego.
W tym celu najpierw piszemy prosty, demonstracyjny skrypt w R, który liczyć będzie sumę argumentów przekazanych z zewnątrz. Użyta funkcja commandArgs() oddaje do R wektor tekstowy. Aby obliczyć sumę musimy wektor tekstowy zamienić na liczbowy, w przeciwnym razie zwrócony zostanie komunikat błędu.

Następnie piszemy polecenie systemowe, które odpala powyższy skrypt. Forma polecenia systemowego wygląda następująco:
  • Rscript "pełna/ścieżka/dostępu/do/skryptu.R" - jeżeli chcemy uruchomić skrypt bez przekazywania argumentów
  • Rscript "pełna/ścieżka/dostępu/do/skryptu.R" arg_1 arg_2 ... arg_n - jeżeli chcemy uruchomić skrypt przekazując n-wartości (oddzielone spacjami)
  • python "pełna/ścieżka/dostępu/do/skryptu.py" arg_1 arg_2 ... arg_n - dla pythona analogicznie do powyższych. 


Po uruchomieniu powyższego kodu w wierszu poleceń otrzymujemy zwrot z R w postaci komunikatu "Suma argumentów to: 165". Formalności mamy już za sobą. Już wkrótce wykorzystamy dzisiejszą wiedzę. Na koniec wspomnę o najważniejszej wadzie takiego podejścia - strata czasu na uruchomienie nowej sesji jest zbyt duża żeby zastosować je w procesie z wieloma iteracjami.

1 komentarz:

  1. Bets | Casinos, & Gaming Experience - JTM Hub
    New casino slot games are 서산 출장안마 introduced every month, including our best-paying slots! Bets. A 보령 출장안마 new slot game called 수원 출장안마 "Spin-Tusk" 군산 출장샵 will appear on every 부천 출장샵 slot machine and

    OdpowiedzUsuń