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?
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.
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é.
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.
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.