¿Por qué no es aconsejable usar attach () en R, y qué debería usar en su lugar?

Supongamos que tenemos un dataframe x que contiene el job y el income las columnas. Hacer referencia a los datos en el marco normalmente requiere los comandos x$job para los datos en la columna de job y x$income para los datos en la columna de income .

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

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

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

Cuándo usarlo:

Utilizo attach() cuando quiero que el entorno que obtiene en la mayoría de los paquetes de estadísticas (por ejemplo, Stata, SPSS) trabaje con un conjunto de datos rectangular a la vez.

Cuándo no usarlo:

Sin embargo, se vuelve muy complicado y el código se vuelve ilegible cuando tienes varios conjuntos de datos diferentes, particularmente si estás usando R como una base de datos relacional cruda, donde diferentes rectangularjs de datos, todos relevantes para el problema en cuestión y tal vez usados ​​en varias formas de comparar datos de los diferentes rectangularjs, 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.

Otra razón para no usar attach es que permite el acceso a los valores de las columnas de un dataframe para lectura (acceso) solamente, y tal como estaban cuando se adjuntaron. No es una abreviatura del valor actual de esa columna. Dos ejemplos:

 > 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 se realizaron cambios en el conjunto de datos de los cars aunque se asignaron dist y speed .

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 

el dist y la speed que se hace referencia en el time cálculo son los valores originales (no transformados); los valores de los cars$dist y la cars$speed cuando se adjuntaron cars .

Creo que no hay nada malo con el uso de 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 de data que hace que las variables de llamada sean bastante fáciles (sensu lm(x ~ y + z, data = mydata) ). Si no, encuentro el uso de para mi satisfacción.

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

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 del espacio de trabajo. Por lo tanto, si desanexa ( detach(data) ) una vez, todavía habrá data presentes 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.