Hier noch einige englische Texte zu dem Thema:
https://google.github.io/styleguide/Rguide.xml
http://rforcats.net/#nonos
http://stackoverflow.com/questions/1006 ... se-instead
Jetzt, wie versprochen, zu den Beispielen - quasi die
attach()-Gruselkammer. Der Datensatz
BOD ist standardmäßig in R vorhanden.
Code: Alles auswählen
B <- BOD
attach(B)
xneu <- demand + 100 # in der Annnahme, dass eine neue Spalte im Dataframe B angelegt wird
detach(B)
B
Wie man sieht, wurde keine Spalte
B$xneu angelegt, sondern der Vektor
xneu wurde in der globalen Enviroment angelegt. Um das genannte Ziel zu erreichen, hätte man doch wieder
B$xneu <- demand + 100 schreiben müssen. Die sauberen Lösungen sehen so aus:
Code: Alles auswählen
B$xneu <- B$demand + 100 ### oder
B$xneu <- with(B, demand + 100)
Zu jedem
attach() muss ein
detach() erfolgen. (Außer, man schließt ohnehin die gesamte R-Session.)
Selbst, wenn man
detach() schreibt, heißt das noch lange nicht, dass es im Verlaufe eines Skriptes auch ausgeführt wird:
Code: Alles auswählen
B <- BOD
attach(B)
m <- lm(demnad ~ Time) # Schreibfehler ...
detach(B) # detach() wird nicht erreicht
Lässt man so ein Skript mehrfach hintereinander laufen, erfolgt immer wieder eine Maskierung der entsprechenden Objekte: die maskierten Objekte sind dann nicht mehr so einfach zu erreichen.
Handelt es sich um größere Objekte, kann man auf diese Weise auch sehr schön schnell den verfügbaren RAM restlos ausschöpfen.
Die saubere Lösung sieht in diesem Fall so aus:
Noch ein Beispiel:
Code: Alles auswählen
B <- BOD
attach(B)
B <- subset(B, demand>11)
B
demand
detach(B)
Sollten hier bei der Ausgabe von
demand nicht nur die Werte erscheinen, die größer als 11 sind (wegen subset(...))
Wahrscheinlich wollte hier jemand folgendes erledigen (dies ist die saubere Lösung):
... und noch eins:
Code: Alles auswählen
B <- BOD
Time <- "Es ist Zeit"
attach(B)
Time # kein einfacher Zugriff auf Spalte B$Time
B$Time # man benötigt für den Zugriff auf die Spalte doch wieder B$...
detach(B)
Wenn man für den Zugriff auf
B$Time durch das
attach() nicht das
B$... einsparen kann, dann ist die Anwendung schwierig. Das verquere an dieser Situation ist, dass sie abhängig davon ist, ob vor dem
attach() ein Objekt im Workspace existiert, das den gleichen Namen hat, wie eine Spalte des Dataframes im Aufruf von
attach()
Gruß, Jörg