2012-04-08 34 views
34

Supongamos que tenemos un marco de datos x que contiene las columnas job y income. Remitir a los datos en el marco normalmente requiere los comandos x$job para los datos en la columna job y x$income para los datos en la columna income.¿Por qué no es aconsejable usar attach() en R, y qué debería usar en su lugar?

Sin embargo, utilizando el comando attach(x) permite eliminar el nombre del marco de datos y el símbolo $ al hacer referencia a los mismos datos. En consecuencia, x$job se convierte en job y x$income se convierte en income en el código R.

El problema es que muchos expertos en R no aconsejan utilizar el comando attach() al codificar en R.

¿Cuál es la razón principal de que? ¿Qué debería usarse en su lugar?

+4

Un problema es que puede tener otros objetos en la memoria, llamados (en su ejemplo) 'job', o' income'. Si quiere usarlos pero tiene 'attach()' ed data frame 'x', es fácil mezclar el uso de los objetos' x $ job' y 'job', o' x $ income' e 'income'. –

Respuesta

34

Cuando se usa:

utilizo cuando quiero attach() el medio ambiente que se obtiene en la mayoría de los paquetes de estadísticas (por ejemplo, Stata, SPSS) de trabajar con un conjunto de datos rectangular a la vez.

Cuando no se usa:

Sin embargo, se vuelve muy desordenado y el código rápidamente se convierte en ilegible cuando se tiene varios conjuntos de datos diferentes, sobre todo si está en efecto el uso de R como una base de datos relacional crudo, cuando sean diferentes Los rectángulos de datos, todos ellos relevantes para el problema en cuestión y que tal vez se utilizan de diversas maneras para comparar datos de los diferentes rectángulos, tienen variables con el mismo nombre.

La función with(), o el argumento data= para muchas funciones, son excelentes alternativas a muchos casos en los que attach() es tentador.

+5

+1 por sugerir 'con'. Si está buscando guardar tipeo/errores tipográficos que es mejor que 'adjuntar'. – Wayne

12

Creo que no hay nada de malo en usar attach. Yo mismo no lo uso (otra vez, amo a los animales, pero tampoco los guardo). Cuando pienso en attach, creo que a largo plazo. Claro, cuando estoy trabajando con un guión, lo sé por dentro y por fuera. Pero en el lapso de una semana, un mes o un año, cuando vuelvo al guión, encuentro que los gastos generales con la búsqueda de cierta variable son demasiado caros. Muchos métodos tienen el argumento data que hace que las variables de llamada sean bastante fáciles (sensu lm(x ~ y + z, data = mydata)). Si no, me parece que el uso de with me satisface.

En resumen, en mi libro, adjuntar está bien para una exploración breve y rápida de datos, pero para desarrollar scripts que yo u otros puedan querer usar, trato de mantener mi código lo más legible (y transferible) posible.

+1

+1 para señalar que 'data =' puede realizar la misma tarea con varios comandos que la tienen. – Wayne

17

Otra razón para no usar attach: permite el acceso a los valores de las columnas de un marco de datos para lectura (acceso) solamente, y tal como estaban cuando están conectados. No es una abreviatura del valor actual de esa columna. Dos ejemplos: Se realizaron

> 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 

No hay cambios en los datos cars conjunto a pesar de que dist y speed fueron asignados a.

Si se asigna explícitamente de nuevo al conjunto de datos ...

> 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 

la dist y speed que se hace referencia en la computación time son los valores originales (no transformadas); los valores de cars$dist y cars$speed cuando se adjuntó cars.

+0

Lo que no me gusta es que todavía necesites usar "cars $" en el lado izquierdo de la ecuación. – skan

7

Si ejecuta attach(data) varias veces, por ejemplo, 5 veces, entonces puede ver (con la ayuda de search()) que sus datos se han adjuntado 5 veces en el entorno de espacio de trabajo. Por lo tanto, si desactiva (detach(data)) una vez, todavía habrá data presente 4 veces en el entorno. Por lo tanto, with()/within() son mejores opciones. Ayudan a crear un entorno local que contiene ese objeto y puede usarlo sin crear confusiones.

Cuestiones relacionadas