Einfache Datentypen in R
Inhalt und Lernziele des Kapitels Einfache Datentypen in R.
Einordnung des Artikels
- Einführung in die Informatik
- Einführung in die Programmiersprache R
- Einfache Datentypen in R
- Einführung in die Programmiersprache R
Einführung
Das Kapitel Einfache Datentypen in R gibt einen ersten Einblick, welche Datentypen in R verfügbar sind und welche Operationen mit ihnen ausgeführt werden können. Dabei wird aber ein Zugang gewählt, der leicht zu Missverständnissen führen kann. Denn in R gibt es keine einfachen Datentypen (oder wie man oft sagt atomare Datentypen oder fundamentale Datentypen), sondern nur Vektoren.
In vielen anderen Programmiersprachen wird scharf zwischen einfachen und zusammengesetzten Datentypen unterschieden, da der Speicher anders organisiert werden muss, wenn zum Beispiel nur eine einzige Zahl oder ein Feld von Zahlen im Speicher abgelegt werden soll. Insbesondere wenn die Länge des Feldes variabel ist (sich also zur Laufzeit des Programmes verändern kann), wird die Speicherorganisation aufwendiger – und der Programmierer muss darauf achten, Felder syntaktisch korrekt einzusetzen.
Hier ist R deutlich benutzerfreundlicher: Echte atomare Datentypen existieren nicht und eine Zahl ist der Spezialfall eines Vektors der Länge 1. (Und es ist kein Problem, die Länge eines Vektors nachträglich zu verändern, sprich neue Komponenten hinzuzufügen oder bestehende Komponenten zu löschen.)
Um den Einstieg in R auch denjenigen zu erleichtern, die noch keine Programmiersprache beherrschen, wird in diesem Kapitel völlig davon abgesehen, dass es Vektoren (und weitere zusammengesetzte Datentypen) gibt. Stattdessen werden Zahlen, logische Werte und Zeichen vorerst so behandelt als wären sie einfache Datentypen.
Inhaltsverzeichnis
- Einführung in R: Zahlen und Variablen
- Einführung in R: Logische Werte
- Einführung in R: Zeichen
- Zahlenbereiche und spezielle Werte in R (Inf, NaN, NA und NULL)
Lernziele
Einführung in R: Zahlen und Variablen
Das Kapitel liefert unerlässliche Grundlagen, um mit R rechnen zu können – gerade Programmier-Einsteigern wird empfohlen, dieses Kapitel gründlich durchzuarbeiten und die gezeigten (oder ähnliche) Beispiele selber zu testen. Wer schon mit einer Programmiersprache vertraut ist, wird die meisten Konzepte so oder so ähnlich bereits kennen.
Zu den genannten unerlässlichen Grundlagen zählen:
- Die arithmetischen Operationen, die mit Zahlen ausgeführt werden können (Grundrechenarten, Ganzzahl-Division, Berechnung des Restes bei Division, Potenz).
- Vergleichsoperatoren (wie größer als, kleiner als).
- Wissenschaftliche Funktionen (wie Exponentialfunktion, Logarithmus, trigonometrische Funktionen).
- Funktionen zum Runden von Zahlen.
Mit Hilfe dieser Operationen und Funktionen können schon zahlreiche Berechnungen ausgeführt werden. Soll im Lauf von mehreren Berechnung (oder in einem Programm) eine Größe unterschiedliche Werte annehmen, spricht man von einer Variable (im Gegensatz zu einer Konstante, deren Wert einmal festgelegt und dann nicht mehr verändert wird). In Programmiersprachen wird der Begriff der Variable anders verwendet als in der Mathematik; die Unterschiede werden erläutert und müssen verstanden werden, um selber mit Variablen arbeiten zu können.
Im Unterschied zu vielen anderen Programmiersprachen ist in R keine Deklaration einer Variable erforderlich; unter Deklaration versteht man meist, dass ein Datentyp für eine Variable vereinbart wird. Eine Variable wird in R sofort mit einem Wert initialisiert und intern wird an der Zuweisung erkannt, welchen Datentyp die Variable besitzen muss. Dies ist für den Anfänger sehr angenehm, da Deklarationen oft mit vielen Spitzfindigkeiten verbunden sind. Umgekehrt hat dies aber den Nachteil, dass man beim Lesen eines Quelltextes oft nicht weiß, mit welchen Objekten man eigentlich arbeitet.
Um jederzeit die Eigenschaften eines Objektes abfragen zu können, gibt es in R eine Reihe von sogenannten Diagnose-Funktionen. Da die bisher vorgestellten Berechnungen sehr einfach sind, wird es einem Anfänger kaum einleuchten, dass die Diagnose-Funktionen von zentraler Bedeutung sind. Wer aber selber an großen Projekten arbeitet und fremde Quelltexte einbindet oder bearbeitet, wird sie sehr häufig verwenden. Beim ersten Lesen sollte es reichen, die Diagnose-Funktionen zur Kenntnis zu nehmen – ihre Tragweite werden Sie erst später einschätzen können.
In vielen Programmiersprachen wird strikt zwischen ganzen Zahlen und Gleitkommazahlen unterschieden, da sie intern anders abgespeichert werden und einen anderen zulässigen Zahlenbereich haben. In R kann man viele Berechnungen durchführen, ohne auf den Unterschied zu achten. Da es aber auch Fälle gibt, wo die Nichtbeachtung des Unterschiedes zu schweren Fehlern führt (etwa beim Vergleich zweier Zahlen), muss man irgendwann kennenlernen, wie ganze Zahlen und Gleitkommazahlen in R vereinbart und eingesetzt werden. Hierzu gehört auch die Kenntnis der Begriffe Modus (mode) und Speichermodus (storage mode).
Einführung in R: Logische Werte
Unter einer Booleschen Variable versteht man eine Variable, die nur die beiden Werte TRUE
(wahr) oder FALSE
(falsch) annehmen kann; intern werden diese logischen Werte TRUE
und FALSE
durch 1 und 0 realisiert.
Das Paradebeispiel für eine Operation, die einen logischen Wert als Ergebnis liefert, ist ein Vergleich zweier Zahlen x und y mit einem Operator wie kleiner als: Der Vergleich x < y
kann nur wahr oder falsch sein, es gibt keine andere Möglichkeit (abgesehen von einer Fehlermeldung, wenn x und y unterschiedlichen Datentyp besitzen und nicht vergleichbar sind).
Ein derartiger logischer Wert, der bei einem Vergleich entsteht, kann in einer Variable abgespeichert werden – man spricht dann von einer logischen Variable oder Booleschen Variable. Mit diesen logischen Variablen lassen sich dann logische Operationen ausführen wie logisches Und (AND), logisches Oder (OR), entweder oder (XOR).
In diesem Kapitel werden Sie kennenlernen,
- wie man Boolesche Variable initialisiert,
- welche logischen Operationen in R zur Verfügung stehen,
- welche Spitzfindigkeiten mit logischen Operationen verbunden sind.
Die hier vorgestellten Beispiele zeigen noch nicht die typischen Einsatzfelder von logischen Variablen; zu einem mächtigen Instrument werden sie erst im Zusammenhang mit Kontrollstrukturen, Funktionen und Vektoren.
Einführung in R: Zeichen
In vielen Programmiersprachen wird scharf zwischen Zeichen (wie 'x'
) und Zeichenketten (wie "Hello World"
) unterschieden, die oft als char (für character) und string bezeichnet werden. In R gibt es diese Unterscheidung nicht und um Zeichen oder Zeichenketten zu kennzeichnen können sowohl Hochkommas als auch Anführungsstriche verwendet werden.
Aber damit ist sofort klar, dass die Definition von Zeichen (oder Zeichenketten) einige Besonderheiten bereithält:
- Da Hochkommas oder Anführungsstriche als Begrenzer verwendet werden, können sie nicht innerhalb einer Zeichenkette verwendet, sondern müssen durch den backslash maskiert werden.
- Aber dann kann auch der backslash nicht eingesetzt werden und muss ebenfalls maskiert werden.
- Es gibt noch weitere Zeichen, die man maskieren muss.
Zum Umgang mit Zeichenketten, die man für die Ausgaben von Programmen oder zur automatisierten Erstellung von Texten benötigt, muss man diese Spitzfindigkeiten kennen. Dazu werden die Eigenschaften der einfachsten Ausgabe-Funktionen vorgestellt.
Weiter werden wieder Diagnose-Funktionen für Zeichen besprochen.
Ein weiteres Thema, mit dem jeder Programmierer konfrontiert wird, sind Typumwandlungen (in R auch oft als coercion bezeichnet). Es wird gezeigt, welche Typumwandlungen zwischen logischen Werten, Zahlen und Zeichen immer möglich sind und welche nur in Spezialfällen ausgeführt werden können. Dies wird später bei Vektoren relevant: Eigentlich dürfen sie nur Komponenten mit identischem Datentyp besitzen; versucht man aber unterschiedliche Datentypen zu vermengen, wird der geeignete Datentyp bestimmt und einige Komponenten werden automatisch umgewandelt.
Zahlenbereiche und spezielle Werte in R (Inf, NaN, NA und NULL)
Da für Variablen nicht beliebig viel Speicherplatz zur Verfügung gestellt werden kann, lassen sich – sowohl für ganze Zahlen (Speichermodus integer) als auch für Gleitkommazahlen (Speichermodus double) – Zahlenbereiche angeben. Für einen souveränen Umgang mit einer Programmiersprache gehört immer:
- Kenntnis dieser Zahlenbereiche.
- Da man sich derartige Zahlen oft nicht merken kann, sollte man zumindest wissen, wie man sie schnell bestimmen kann.
- Kenntnis, welche Warnung oder Fehlermeldung erzeugt wird, wenn der zulässige Zahlenbereich überschritten wird.
Die restlichen Inhalte dieses Kapitels über die sogenannten speziellen Werte können in einem ersten Durchgang lediglich überflogen werden, da sie eher Spezialfälle und kleinliche Unterscheidungen beschreiben, die den Programmier-Anfänger mehr verwirren als sein Verständnis der Programmiersprache fördern. Diese speziellen Werte kommen zum Beispiel dann zum Einsatz, wenn
- ein zulässiger Zahlenbereich überschritten wird (Inf),
- eine Berechnung nicht durchgeführt werden kann (NaN), wie etwa 0/0 oder die Wurzel aus einer negativen Zahl,
- ein Wert nicht vorliegt (NA)
- oder sogar ein Objekt nicht vorliegt (NULL).
Für den Anfänger ist es wichtiger zunächst zu lernen, wie man überhaupt Berechnungen durchführt. Welche Ausnahmen dabei auftreten können, sind erst dann wichtig, wenn man selbst Funktionen schreibt. Denn je nachdem welche Ausnahme eintritt (oder eintreten kann), muss man entsprechende Anweisungen vorbereiten, damit die Berechnungen sinnvoll fortgesetzt werden können. Ohne die Kenntnis der speziellen Werte wird man diese Ausnahme-Behandlung nicht meistern.