web-dev-qa-db-fra.com

Pourquoi est-il déconseillé d'utiliser attach () dans R, et que dois-je utiliser à la place?

Supposons que nous ayons un bloc de données x qui contient les colonnes job et income. La référence aux données dans le cadre nécessite normalement les commandes x$job Pour les données de la colonne job et x$income Pour les données de la colonne income.

Cependant, l'utilisation de la commande attach(x) permet de supprimer le nom de la trame de données et le symbole $ En se référant aux mêmes données. Par conséquent, x$job Devient job et x$income Devient income dans le code R.

Le problème est que de nombreux experts de R conseillent de NE PAS utiliser la commande attach() lors du codage en R.

Quelle en est la principale raison? Que faut-il utiliser à la place?

46
SavedByJESUS

Quand l'utiliser:

J'utilise attach() quand je veux l'environnement que vous obtenez dans la plupart des paquets de statistiques (par exemple Stata, SPSS) de travailler avec un seul ensemble de données rectangulaire à la fois.

Quand ne pas l'utiliser:

Cependant, cela devient très compliqué et le code devient rapidement illisible lorsque vous disposez de plusieurs ensembles de données différents, en particulier si vous utilisez en fait R comme base de données relationnelle brute, où différents rectangles de données, tous pertinents pour le problème en question et peut-être utilisés dans différentes façons de faire correspondre les données des différents rectangles, ont des variables avec le même nom.

La fonction with(), ou l'argument data= De nombreuses fonctions, sont d'excellentes alternatives à de nombreuses instances où attach() est tentant.

43
Peter Ellis

Une autre raison de ne pas utiliser attach: il permet d'accéder aux valeurs des colonnes d'un bloc de données pour la lecture (accès) uniquement, et telles qu'elles étaient lorsqu'elles étaient attachées. Ce n'est pas un raccourci pour la valeur actuelle de cette colonne. Deux exemples:

> 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

Aucune modification n'a été apportée à l'ensemble de données cars même si dist et speed ont été affectés à.

S'il est explicitement attribué à nouveau à l'ensemble de données ...

> 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 et speed qui sont référencés dans le calcul time sont les valeurs d'origine (non transformées); les valeurs de cars$dist et cars$speed lorsque cars était attaché.

22
Brian Diggs

Je pense qu'il n'y a rien de mal à utiliser attach. Je ne l'utilise pas moi-même (là encore, j'aime les animaux, mais n'en garde pas non plus). Quand je pense à attach, je pense à long terme. Bien sûr, quand je travaille avec un script, je le connais à l'intérieur comme à l'extérieur. Mais dans une semaine, un mois ou un an quand je reviens au script, je trouve les frais généraux liés à la recherche de l'origine d'une certaine variable, tout simplement trop chers. De nombreuses méthodes ont l'argument data qui rend l'appel des variables assez facile (sensulm(x ~ y + z, data = mydata)). Sinon, je trouve l'utilisation de with à ma satisfaction.

En bref, dans mon livre, attach est bien pour une exploration rapide et rapide des données, mais pour développer des scripts que moi ou d'autres voudrions utiliser, j'essaie de garder mon code aussi lisible (et transférable) que possible.

15
Roman Luštrik

Si vous exécutez attach(data) plusieurs fois, par exemple 5 fois, vous pouvez voir (à l'aide de search()) que vos données ont été jointes 5 fois dans l'environnement de l'espace de travail. Donc, si vous le désassociez (detach(data)) une fois, il y aura toujours data présent 4 fois dans l'environnement. Par conséquent, with()/within() sont de meilleures options. Ils aident à créer un environnement local contenant cet objet et vous pouvez l'utiliser sans créer de confusion.

11
Aquarian91