
Příkazy v R
R pracuje s příkazy - základní příkazy jsou výrazy (2 +3) nebo přiřazení (a=2+3).
Příkazy se oddělují pomocí středníku, nebo novým řádkem. Pokud příkaz nekončí na konci řádku, začátek každého následujícího řádku bude mít znak + až do konce syntaxe příkazu.
Příkazové řádky jsou limitovány na cca 4095 bytů.
Komentáře se označují symbolem # (vše v řádku za tímto symbolem není vyhodnoceno jako příkaz, ale jako komentář).
Příkazy můžeme spustit i načítáním externího souboru, který příkazy obsahuje:
> source("skript.R")
Textové výsledky můžeme namísto zobrazení do konzoly ukládat do externího souboru pomocí příkazu
> sink("vysledky.txt")
ukládání ukončíme pomocí
> sink()
Přiřazení
Pokud je zadaným příkazem výraz, vyhodnotí se, zobrazí, a jeho hodnota se vymaže
> 2 + 3
[1] 5
[1] na začátku řádku, který zobrazuje výsledek
Přiřazení také vyhodnotí výraz, ale jeho hodnota se přiřadí proměnné. Výsledek se normálně nezobrazí. Přiřazení se děje operátory "<-", "=", nebo pomocí přiřazovací funkce assign()
> x <- 5
> x = 5
> assign ("x", 5)
Jaký je tedy mezi nimi rozdíl?
"<-" se doporučuje používat ve většině případů definice objektů nebo funkcí, s výjimkou zadávání parametrů funkce. Tento znak přiřadí hodnotu proměnné.
"=" je nutné používat hlavně při zadávání parametrů funkce
Demonstrujme si na příkladu použití těchto znaků
Pro vytvoření seznamu použijeme funkci list(). Při zadávání hodnot jednotlivých prvků seznamu používáme operátor "=", při přiřazení seznamu do proměnné "film" pak použijeme "<-".
> film <- list(jmeno="bond, james bond", vek=40, zenaty=F, herci=c("Sean Connery", "George Lazenby", "Roger Moore", "Timothy Dalton", "Pierce Brosnan", "Daniel Craig"))
> film
$jmeno
[1] "bond, james bond"
$vek
[1] 40
$zenaty
[1] FALSE
$herci
[1] "Sean Connery" "George Lazenby" "Roger Moore" "Timothy Dalton" "Pierce Brosnan" "Daniel Craig"
Další správná, ale nedoporučovaná (ve smyslu konvence) varianta tohoto kódu je použít přiřazení seznamu do proměnné "film" znak "=" místo "<-":
> film = list(jmeno="bond, james bond", vek=40, zenaty=F, herci=c("Sean Connery", "George Lazenby", "Roger Moore", "Timothy Dalton", "Pierce Brosnan", "Daniel Craig"))
> film
$jmeno
[1] "bond, james bond"
$vek
[1] 40
$zenaty
[1] FALSE
$herci
[1] "Sean Connery" "George Lazenby" "Roger Moore" "Timothy Dalton" "Pierce Brosnan" "Daniel Craig"
Variace, při které se použije operátor "<-" místo "=" při zadávání hodnot prvkům seznamu, již správná není:
> film <- list(jmeno<-"bond, james bond", vek=40, zenaty=F, herci=c("Sean Connery", "George Lazenby", "Roger Moore", "Timothy Dalton", "Pierce Brosnan", "Daniel Craig"))
> film
[[1]]
[1] "bond, james bond"
$vek
[1] 40
$zenaty
[1] FALSE
$herci
[1] "Sean Connery" "George Lazenby" "Roger Moore" "Timothy Dalton" "Pierce Brosnan" "Daniel Craig"
Co se stalo? První prvek seznamu sice hodnotu má, ale již nemá jméno, pouze pořadí [[1]]. Naopak, v pracovním prostoru nám přibyla proměnná "jmeno".
> jmeno
[1] "bond, james bond"
Jak je to možné? Operátor "<-" totiž znamená vytvoření objektu v nejvyšším levelu (top level) prostředí, kde pracujeme, ne zadání hodnoty proměnné. Protože R vyhodnocuje příkazy systémem "zevnitř", nejdříve vyhodnotilo každou z proměnných funkce.
Protože se uvnitř zadání vyskytl operátor "<-", provedl se v nejvyšším levelu - v tomto případě přímo v základním prostředí - příkaz.
> jmeno<-"bond, james bond"
Jako první objekt funkce proto dosadil hodnotu objektu "jmeno".
U dalších proměnných funkce tento problém nenastal, protože R vyhodnotilo zadání např: vek=40 jako "druhý prvek seznamu má název věk a hodnotu 40".
assign() je funkce ekvivalentní operátoru "<-". Využívá se v případě, že chceme definovat názvy proměnných s pomocí proměnné a funkce paste():
> for (i in c (1:5))
{
assign (paste ("m", i, "na2", sep = ""), i ^ 2)
}
> ls(pattern="na2")
[1] "m1na2" "m2na2" "m3na2" "m4na2" "m5na2"
> m2na2
[1] 4
get() zobrazí hodnotu objektu vzniklého přiřazením hodnoty pomocí assign()
Zajímavostí je, že R umí vyhodnotit i operátor "->", avšak název proměnné musí být vpravo a její hodnota vlevo:
> 5 -> x
!!! Na co si dávat pozor !!!
Při použití logického operátoru < může nastat problém, je-li jeden z objektů negativní číslo:
V tomto případě musíme použít mezeru mezi operátorem a znaménkem mínus, jinak R buď zahlásí chybu
> 2<-5
Error in 2 <- 5 : invalid (do_set) left-hand side to assignment
... nebo se příkaz vyhodnotí jako přiřazení:
> a=2
> a<-5
> a
[1] 5
Umístění mezery mezi operátorem a znaménkem mínus problém vyřeší:
> 2< -5
[1] FALSE
Další mezery neuškodí, ale jsou zbytečné:
> 2< - 5
[1] FALSE
> 2 < - 5
[1] FALSE
Použití závorek je dalším způsobem jak problému předejít:
> 2<(-5)
[1] FALSE