Slovník | Vyhledávání | Mapa webu
 
Základy informatiky pro biologyCvičebnice jazyka R 1. cvičení – Rozšířené základy jazyka R

1. cvičení – Rozšířené základy jazyka R

Rozšířené základy jazyka R

Cíle 1. cvičení: nastavení pracovní složky, instalace a připojení potřebných balíků, korektní načtení dat ze souboru, zjištění a ověření datového typu.

Pro cvičení využijeme podkladová data týkající se znečištění ovzduší města Brna. Podklady pocházejí z repozitáře vědeckých dat Genasis a obsahují hodnoty vzdušných koncentrací polychlorovaných bifenylů (PCB) naměřených na čtyřech lokalitách ve městě Brně. Vaším úkolem bude zřídit pracovní soubor v jazyce R, korektně načíst data, připojit příslušné balíky potřebné pro vykreslení dat do mapy a následně vynést polohu všech lokalit do mapy města Brna.


Nastavení pracovní složky

Pro práci se soubory (vstupní data, výstupy) je v R nutné nastavit pracovní složku, ze které se budou data načítat a do které se budou ukládat výsledky. K tomuto účelu slouží funkce setwd(), jejímž argumentem je řetězec obsahující cestu k pracovní složce. Např.:

setwd("C:/R/cviceni_1")

Poznámka: Pozor při zadávání adresy, veškeré funkce v jazyce R, stejně jako jazyk samotný, rozlišují velká a malá písmena (case sensitive).

Pro zjištění aktuální nastavené pracovní cesty je možné využít funkci getwd(), která nemá žádný argument:

getwd()


Instalace a načtení knihoven

Jazyk R má modulární rekurentní strukturu – veškeré funkce jsou uspořádány do dílčích balíků (anglicky packages) obsahujících data a funkce, které jsou samy psány v jazyce R. Složením vybrané kombinace balíků lze získat takovou množinu funkcí, která optimálně odpovídá konkrétní výpočetní potřebě, bez nutnosti zahlcovat paměť počítače množstvím nevyužitích funkcí. Základní distribuce jazyka R (aktuálně v červnu 2018 verze 3.5.0) je složena z 12 implicitních balíků (jsou k dispozici ihned po instalaci R a není je třeba připojovat samostatně):

  • base
  • compiler
  • datasets
  • graphics
  • grDevices
  • grid
  • methods
  • parallel
  • splines
  • stats
  • stats4
  • tcltk

Pokud je ovšem třeba pro konkrétní účely využít funkci (případně data), která není v těchto dvanácti balících obsažena, je nutné získat a nainstalovat balík, který funkci (data) obsahuje a po instalaci balík připojit. K tomu slouží funkce install.packages() a library(), jejichž argumenty jsou řetězce obsahující název balíku nebo cestu k němu. Balík může vytvořit každý uživatel jazyka R, na webu existuje několik repozitářů balíků, z nichž nejvýznamnější je Comprehensive R Archive Network (CRAN), umožňující distribuovat formálně správně vytvořené balíky mezi uživateli navzájem.

Celkem je v oficiálním repozitáři CRAN v červnu 2018 k dispozici 12 600 rozšiřujících balíků, které lze instalovat přímo z jeho webové stránky.

Instalaci balíku z repozitáře CRAN provedeme jednoduše zadáním názvu balíku jako jediného argumentu funkce. Pro potřeby následujícího zadání budeme instalovat balík jpeg, který umožňuje načíst obrázek ve formátu JPEG a umístit ho do grafu:

install.packages("jpeg")

Balík se stáhne a nainstaluje do implicitně zadané složky v počítači, na kterém běží R skript, případně lze zadat alternativní složku pro instalaci jako argument lib. Pro připojení a načtení balíku a v něm uložených funkcí nebo dat pak využijeme funkce library:

library("jpeg")

Pokud je balík třeba odpojit (např. z důvodu úspory paměti, načtení jiné verze aj.), lze využít funkci detach(), která slouží obecně pro odpojení databází (proměnných nebo balíků) z prostředí R. V případě balíku je nutné před jeho název napsat klíčové slovo package::

detach("package:jpeg")

V případě, že je třeba balík dokonce odinstalovat, lze obdobným způsobem využít funkci remove.packages(), která balík odstraní ze složky, do které byl nainstalován.


Načtení dat

Problematika načítání dat do prostředí jazyka R je poměrně obsáhlá, existuje řada balíků odpovídajících různým formátům vstupních souborů. V našem příkladě si vystačíme s funkcí read.csv(), resp. read.csv2() které jsou součástí implicitního balíku utils:

Funkce read.csv() je vytvořena pro načítání dat formátu .csv ( comma separated values = hodnoty oddělené čárkou), tj. tabulka hodnot (lze si ji představit jako typickou tabulku např. z MS Excel). Původní formát .csv je pro svoji jednoduchost a nezávislost na konkrétním software velice populární pro výměnu dat mezi různými aplikacemi a rovněž široce používaný pro uchovávání číselných i textových hodnot. Zápis je specifikován pomocí oddělovače buněk (sloupců, oddělovače řádků, desetinného oddělovače a uvozovek, které je nutné použít, pokud chceme zapsat znak pro oddělení buňky dovnitř buňky. Původní .csv formát používá pro oddělení buněk čárku, pro oddělení řádků znak konce řádku, jako desetinný oddělovač tečku a americké dvojité uvozovky. V Evropě se nicméně lze častěji setkat s desetinným oddělovačem ve formě čárky, kterou tak není vhodné používat pro oddělování buněk a bývá nahrazena středníkem. Právě takový typ souboru umožňuje načíst funkce read.csv2().

V praxi může dojít k tomu, že u konkrétního souboru nevíme, zda je jako desetinný oddělovač použita čárka nebo tečka, a je nutné import vyzkoušet oběma způsoby. Např.:

brno1<-read.csv("brno.csv")
brno2<-read.csv2("brno.csv")

Zde v prvním případě obdržíme chybové hlášení "", které dává tušit, že funke read.csv() nebyla správně zvolena; naproti tomu funkce read.csv2() proběhne bezproblémově a do proměnné brno2 uloří obsah souboru brno.csv.

O obsahu proměnné se snadno přesvědčíme spuštěním samotného názvu proměnné, což vypíše její obsah (v případě většího množství dat jen část obsahu) na obrazovku:

brno2

Alternativně lze vypsat obsah proměnné uzavřením celého řádku s prováděným příkazem do kulatých závorek:

(brno2<-read.csv2("brno.csv"))


Využití funkcí z načtených balíků

Funkce z načtených balíků lze přímo využívat bez jakékoliv další specifikace, např. funkce readJPEG() nám poslouží pro načtení obrázku s mapou Brna ve formátu jpg (joint photographic experts group) a jeho uložení do proměnné obrazek:

obrazek<-readJPEG("brno.jpg")

Ve výjímečných případech nicméně může dojít k tomu, že dva balíky obsahují různé funkce se stejným názvem. V takovém případě je třeba se uchýlit k alternativnímu volání funkce z nainstalovaného (ale nikoliv nutně připojeného) balíku pomocí volání jeho názvu, dvojice dvojteček a názvu funkce:

obrazek<-jpeg::readJPEG("brno.jpg")

Poznámka: nahlédnutím do proměnné obrazek se lze přesvědčit o číselné reprezentaci jednotlivých pixelů v načtené bitmapové grafice - každý pixel je reprezentován trojicí čísel od 0 do 255, která odpovídají sytosti červené, zelené a modré barvy (RGB). Takový obrázek lze potom dále zpracovat pomocí vhodných vykreslovacích funkcí.


Vykreslení grafu

K vykreslování grafů slouží v jazyce R široká množina funkcí, z nichž nejzákladnější je generická funkce plot, umožňující vykreslení nejjednodušších objektů (body, úsečky). Po zavolání funkce plot a vykreslení „podkladového“ grafu je možné dále přidávat do grafu (přes sebe) další objekty až do doby, kdy je pro dané vykreslovací zařízení zavolána znovu funkce plot().

K vykreslení mapy Brna, kterou jsme v předchozí práci načetli do proměnné obrazek využijeme funkci rasterImage z implicitního balíku graphics.

Nejprve zkusíme vykreslit samotnou mapku do okna grafů v R studiu. Za tímto účelem nejprve vytvoříme libovolný graf, do kterého potom uloženou bitmapu umístíme. V našem případě to může být například graf s osami x a y jdoucími od 0 do 1. Následně využijeme funkci rasterImage pro vykreslení obrázku, jehož krajní levý dolní roh umístíme do bodu [0,0] a pravý horní roh do bodu [1,1]:

plot(c(0,1),c(0,1))
rasterImage(obrazek,0,0,1,1)

V závislosti na rozměrech okna R studia jsme tak získali nepříliš vzhledné vykreslení mapky, která je ovšem k dispozici pouze po dobu práce v R studiu a po jeho uzavření zmizí. Využijeme proto funkcí jpeg a dev.off() pro spuštění vykreslovacího zařízení JPEG souborů a jeho následné vypnutí. Obrázek tak bude vykreslen do souboru, jehož název zadáme (uvnitř pracovní složky). Rozměry souboru převezmeme z původního obrázku. Na závěr je nutné vykreslovací zařízení vypnout pomocí funkce dev.off(), která zajistí uložení souboru:

jpeg(filename="brno_vykreslene.jpg",width=817,height=558)
plot(c(0,1),c(0,1))
rasterImage(obrazek,0,0,1,1)
dev.off()

Pro nastavení vzhledu vykreslovaného grafu lze využít nepřebernou množinu argumentů a dalších funkcí. Prozatím si vystačíme s funkcí par(), která nám umožní umístit rohy vykreslovaného obrázku do rohů souboru tak, aby zmizel rámeček i nadbytečné osy, které v mapce nepotřebujeme.

Za títmo účelem využijeme skutečnosti, že známe zeměpisné souřadnice levého dolního a pravého horního rohu naší mapky (49,1239444 °SZŠ, 16,4162664 °VZD a 49,2648419 °SZŠ, 16,7952947 °VZD) a vykrelíme graf právě v tomto rozmezí (zakřivení planety Země na území Brna zanedbáme). Navíc pomocí funkce par() nastavíme všechny čtyři okraje grafu na nulovou šířku (par(mar=c(0,0,0,0))) a využijeme argumenty funkce plot() xaxs a yaxs, pomocí kterých změníme standardní čtyřprocentní odsazení x-ové a y-ové osy na nulu:

jpeg(filename="brno_vykreslene.jpg",width=817,height=558)
par(mar=c(0,0,0,0))
plot(c(16.4162664,16.7952947),c(49.1239444,49.2648419),xaxs="i",yaxs="i")
rasterImage(obrazek,16.4162664,49.1239444,16.7952947,49.2648419)
dev.off()

Tímto způsobem jsme dokázali do souboru brno_vykreslene.jpg překreslit původní obsah souboru brno.jpg. V posledním kroku přidáme pomocí funkce points() do grafu body odpovídající souřadnicím lokalit, na kterých byly měřeny koncentrace PCB ve městě.

Protože souřadnice, které budeme pro vykreslení používat, jsou uloženy v datovém rámci brno2 (kam jsme si je načetli pomocí funkce read.csv2(), jednoduše zadáme jako argumenty funkce points() příslušné sloupečky tohoto datového rámce (vybrané pomocí operátoru „dolar“ $. Funkci points() ovšem musíme volat v rámci vykreslovací sekvence. Jako volitelné argumenty zadáme barvu vykreslovaných bodů (col), jejich tvar (pch) a velikost (cex):

jpeg(filename="brno_vykreslene.jpg",width=817,height=558)
par(mar=c(0,0,0,0))
plot(c(16.4162664,16.7952947),c(49.1239444,49.2648419),xaxs="i",yaxs="i")
rasterImage(obrazek,16.4162664,49.1239444,16.7952947,49.2648419)
points(brno2$delka,brno2$sirka,col="brown",pch=19,cex=2)
dev.off()

Výsledkem je mapka se čtveřicí vyznačených bodů, které odpovídají měřícím lokalitám PCB na území města Brna.


Cvičení

  1. Zjistěte, jak je nastavena vaše aktuální pracovní složka.
  2. Použijte příslušnou funkci a nastavte si pracovní složku, do které budete ukládat níže vytvořené soubory.
  3. Nainstalujte do R balíky jpeg a cairo z repozitáře CRAN.
  4. Načtěte do datové tabulky brno obsah souboru brno.csv. Můžete soubor stáhnout na disk a načíst nebo zadat do příslušné funkce přímo jeho URL adresu.
  5. Použijte funkci plot() pro vykreslení „prázdného“ grafu (území města Brna) s rozsahem vodorovné osy od 16,4162664 do 16,7952947 a svislé osy od 49,1239444 do 49,2648419. Osy budou představovat rozsah ve stupních východní zeměpisné délky a severní zeměpisné šířky.
  6. Stáhněte a do pracovní složky uložte plánek Brna dostupný pod tímto odkazem.
  7. Načtěte plánek do nějaké proměnné v prostředí R a umístěte jej pomocí funkce rasterImage na pozadí právě vytvořeného grafu.
  8. Vyznačte v grafu ve formě červených kroužků body s následujícími souřadnicemi:

    body<-data.frame("x"=c(16.5984233,16.5979942,16.5923828,16.5689725,
    16.5953869,16.5989167,16.6023928,16.5774269,16.5691442),
    "y"=c(49.2004269,49.2046611,49.2082008,49.1771400,49.1872317,
    49.2099392,49.1973003,49.1934092,49.1785497))

  9. Pokuste se odhadnout o jaké body na plánku Brna se jedná.
  10. Vyznačte na plánku ve formě černých kroužků polohu měřících stanic znečištění ovzduší z datové tabulky brno.
  11. Uložte takto vytvořenoý plánek ve formě .jpg obrázku do pracovní složky.
  12. Využijte funkci svg() pro vytvoření téhož plánku ve formě vektorové grafiky a uložte jej ve formě .svg obrázku do pracovní složky.
 
vytvořil Institut biostatistiky a analýz Lékařské fakulty Masarykovy univerzity