2012-04-08 17 views
34

Załóżmy, że mamy ramkę danych x, która zawiera kolumny job i income. Odwołanie się do danych w ramce zwykle wymaga poleceń x$job dla danych w kolumnie i x$income dla danych w kolumnie income.Dlaczego nie zaleca się używania metody attach() w wersji R i co powinienem zamiast tego użyć?

Jednak użycie polecenia attach(x) pozwala na usunięcie nazwy ramki danych i symbolu $ w odniesieniu do tych samych danych. W związku z tym x$job staje się job i x$income staje się income w kodzie R.

Problemem jest to, że wielu ekspertów w dziedzinie badań zalecają NIE używać komendy attach() podczas kodowania w R.

Jaki jest główny powód? Co należy zamiast tego użyć?

+4

Jednym z problemów jest to, że możesz mieć w pamięci inne obiekty, wywoływane (w twoim przykładzie) 'zadanie' lub' dochód'. Jeśli chcesz ich użyć, ale posiadasz 'attach()' ed ramkę danych 'x', łatwo jest wymieszać użycie obiektów' x $ job' i 'job' lub' x $ income' i 'income'. –

Odpowiedz

34

Kiedy stosować:

używam attach() kiedy chcę środowiska można dostać w większości stats pakietów (np Stata, SPSS) pracować z jednym prostokątnym zbiorze naraz.

Kiedy go nie używać:

Jednak robi się bardzo brudny i kod szybko staje się nieczytelny, gdy masz kilka różnych zestawów danych, szczególnie jeśli są w rzeczywistości za pomocą R jako surowy relacyjnej bazy danych, gdzie różne prostokąty danych, wszystkie istotne dla danego problemu i być może używane na różne sposoby dopasowywania danych z różnych prostokątów, mają zmienne o tej samej nazwie.

Funkcja with() lub argument o wielu funkcjach data= stanowią doskonałą alternatywę dla wielu sytuacji, w których kuszące jest attach().

+5

+1 za sugerowanie 'z'. Jeśli szukasz zapisywania pisania/literówek, które jest lepsze niż "dołącz". – Wayne

12

Myślę, że nie ma nic złego w korzystaniu z attach. Ja tego nie używam (potem znowu, kocham zwierzęta, ale też ich nie trzymam). Kiedy myślę o attach, myślę, że długoterminowe. Oczywiście, kiedy pracuję ze skryptem, znam go od środka i na zewnątrz. Ale za tydzień, miesiąc lub rok, kiedy wracam do skryptu, znajduję koszty ogólne z wyszukiwaniem, skąd pochodzi pewna zmienna, po prostu zbyt droga. Wiele metod ma argument data, który sprawia, że ​​wywoływanie zmiennych jest całkiem łatwe (sensu lm(x ~ y + z, data = mydata)). Jeśli nie, uważam, że użycie with jest dla mnie satysfakcjonujące.

Krótko mówiąc, w mojej książce załącznik jest odpowiedni do szybkiego szybkiego eksplorowania danych, ale do tworzenia skryptów, których ja lub ktoś inny chciałby użyć, staram się zachować mój kod jako czytelny (i możliwy do przeniesienia).

+1

+1 dla wskazania, że ​​'data =' może wykonać to samo zadanie z różnymi poleceniami, które go mają. – Wayne

17

Kolejny powód, dla którego nie należy używać attach: umożliwia dostęp do wartości kolumn ramki danych tylko do odczytu (dostępu), a także w momencie dołączenia. Nie jest skrótem dla bieżącej wartości tej kolumny. Dwa przykłady:

> head(cars) 
    speed dist 
1  4 2 
2  4 10 
3  7 4 
4  7 22 
5  8 16 
6  9 10 
> attach(cars) 
> # convert stopping distance to meters 
> dist <- 0.3048 * dist 
> # convert speed to meters per second 
> speed <- 0.44707 * speed 
> # compute a meaningless time 
> time <- dist/speed 
> # check our work 
> head(cars) 
    speed dist 
1  4 2 
2  4 10 
3  7 4 
4  7 22 
5  8 16 
6  9 10 

nie dokonano zmian w danych cars określonych chociaż dist i speed zostały przypisane.

Jeśli jest wyraźnie przypisany do zestawu danych ...

> head(cars) 
    speed dist 
1  4 2 
2  4 10 
3  7 4 
4  7 22 
5  8 16 
6  9 10 
> attach(cars) 
> # convert stopping distance to meters 
> cars$dist <- 0.3048 * dist 
> # convert speed to meters per second 
> cars$speed <- 0.44707 * speed 
> # compute a meaningless time 
> cars$time <- dist/speed 
> # compute meaningless time being explicit about using values in cars 
> cars$time2 <- cars$dist/cars$speed 
> # check our work 
> head(cars) 
    speed dist  time  time2 
1 1.78828 0.6096 0.5000000 0.3408862 
2 1.78828 3.0480 2.5000000 1.7044311 
3 3.12949 1.2192 0.5714286 0.3895842 
4 3.12949 6.7056 3.1428571 2.1427133 
5 3.57656 4.8768 2.0000000 1.3635449 
6 4.02363 3.0480 1.1111111 0.7575249 

dist i speed które są wymienione w obliczeniach time są oryginalne (Nietransformowane) wartości; wartości cars$dist i cars$speed zostały dołączone.

+0

Nie podoba mi się to, że nadal musisz używać "samochodów $" po lewej stronie równania. – skan

7

Jeśli wykonasz attach(data) kilka razy, np. 5 razy, wtedy możesz zobaczyć (przy pomocy search()), że twoje dane zostały dołączone 5 razy w środowisku przestrzeni roboczej. Jeśli więc usuniesz (detach(data)) raz, nadal będzie istnieć data obecny 4 razy w środowisku. Stąd, with()/within() są lepsze opcje. Pomagają stworzyć lokalne środowisko zawierające ten obiekt i można z niego korzystać bez tworzenia jakichkolwiek pomyłek.

Powiązane problemy