2009-08-21 17 views
26

Muchos libros y guías de introducción R comienzan con la práctica de adjuntar un data.frame para que pueda llamar las variables por su nombre. Siempre me ha parecido favorable llamar a las variables con la notación $ o el corchete cuadrado [,2]. De esa manera puedo usar múltiples data.frame s sin confundirlos y/o usar la iteración para llamar sucesivamente columnas de interés. Me di cuenta de Google ha publicado recientemente coding guidelines for R que incluía la línea¿Utiliza attach() o variables de llamada por nombre o división?

1) adjuntar: evitar su uso

¿Cómo se sienten acerca de esta práctica?

Respuesta

25

I never use attach. with y within son tus amigos.

código Ejemplo:

> N <- 3 
> df <- data.frame(x1=rnorm(N),x2=runif(N)) 
> df$y <- with(df,{ 
    x1+x2 
}) 
> df 
      x1   x2   y 
1 -0.8943125 0.24298534 -0.6513271 
2 -0.9384312 0.01460008 -0.9238312 
3 -0.7159518 0.34618060 -0.3697712 
> 
> df <- within(df,{ 
    x1.sq <- x1^2 
    x2.sq <- x2^2 
    y <- x1.sq+x2.sq 
    x1 <- x2 <- NULL 
}) 
> df 
      y  x2.sq  x1.sq 
1 0.8588367 0.0590418774 0.7997948 
2 0.8808663 0.0002131623 0.8806532 
3 0.6324280 0.1198410071 0.5125870 

Editar: Hadley menciona a transformar en los comentarios. Aquí hay un código:

> transform(df, xtot=x1.sq+x2.sq, y=NULL) 
     x2.sq  x1.sq  xtot 
1 0.41557079 0.021393571 0.43696436 
2 0.57716487 0.266325959 0.84349083 
3 0.04935442 0.004226069 0.05358049 
+3

'transform' es otra variación útil en el interior. – hadley

+1

En realidad, me acabo de dar cuenta de que, a diferencia de las funciones 'attach()', 'with()' no 'resuelve'. Primero configure 'printx <- function {print (x)}'. Ahora, 'with (list (x = 42), printx())' falla aunque 'con (list (x = 42), print (x))' y 'attach (list (x = 42)); printx() '¡triunfar! :( –

3

que prefieren no utilizar attach(), ya que es demasiado fácil de ejecutar un lote de código varias veces cada vez que llamar attach(). El marco de datos se agrega a la ruta de búsqueda cada vez, ampliándolo innecesariamente. Por supuesto, una buena práctica de programación también es detach() al final del bloque de código, pero a menudo se olvida.

En su lugar, utilizo xxx $ y o xxx [, "y"]. Es más transparente.

Otra posibilidad es utilizar el argumento de datos disponible en muchas funciones que permite hacer referencia a variables individuales dentro del marco de datos. por ejemplo, lm(z ~ y, data=xxx).

+0

A veces llamo desde varios marcos de datos y variables globales, y este sistema significa que nunca se realizará un cálculo incorrecto. – Michelle

8

El principal problema con la conexión es que puede provocar un comportamiento no deseado. Supongamos que tiene un objeto con el nombre xyz en su área de trabajo. Ahora adjunte el marco de datos abc que tiene una columna llamada xyz. Si su código hace referencia a xyz, ¿puede garantizar que se trata de referencias al objeto o a la columna del marco de datos? Si no usa adjuntar, entonces es fácil. solo xyz se refiere al objeto. abc $ xyz se refiere a la columna del marco de datos.

Una de las principales razones por las que adjuntar se usa con frecuencia en los libros de texto es que acorta el código.

+0

He notado que algunos libros de texto dicen "no hagas esto, adjuntar se usa para simplificar los ejemplos". – Michelle

13

me gusta mucho más el uso with para obtener el equivalente de attach en un solo comando:

with(someDataFrame, someFunction(...)) 

Esto también conduce naturalmente a un formulario donde subset es el primer argumento:

with(subset(someDataFrame, someVar > someValue), 
     someFunction(...)) 

cuales deja bastante claro que operamos sobre una selección de datos. Y aunque muchas funciones de modelado tienen los argumentos data y subset, el uso anterior es más consistente ya que también se aplica a aquellas funciones que no tienen argumentos data y subset.

7

"Attach" es una tentación del mal.El único lugar donde funciona bien es en la configuración de aula, donde a uno se le da un solo dataframe y se espera que escriba líneas de código para hacer el análisis en ese único marco de datos. El usuario es poco probable que utilice cada vez que los datos de nuevo una vez que la asignacion se realiza y entregado.

Sin embargo, en el mundo real, más tramas de datos se pueden añadir a la recogida de datos en un proyecto en particular. Además, a menudo se copian y pegan bloques de código que se utilizarán para algo similar. A menudo uno toma prestado de algo que hizo hace unos meses y no puede recordar los matices de lo que se llamaba desde dónde. En estas circunstancias uno se ahoga con el uso anterior de "adjuntar".

2

Si bien yo también prefiero no utilizar attach(), tiene su lugar cuando necesita persistir un objeto (en este caso, un data.frame) durante la vida de su programa cuando tiene varias funciones utilizándolo. En lugar de pasar el objeto a cada función R que lo usa, creo que es más conveniente mantenerlo en un lugar y llamar a sus elementos según sea necesario.

Dicho esto, solo lo usaría si sé cuánta memoria tengo disponible y solo si me aseguro de que detach() este data.frame una vez que esté fuera del alcance.

¿Tengo sentido?

3

Al igual que Leoni dijo, with y son perfectos sustitutos de attach, pero yo no lo descartaría por completo. Lo uso a veces, cuando estoy trabajando directamente en el prompt R y quiero probar algunos comandos antes de escribirlos en un script. Especialmente cuando se prueban múltiples comandos, attach puede ser una alternativa más interesante, conveniente e incluso inofensiva a with y within, ya que después de ejecutar attach, el símbolo del sistema es claro para que escriba las entradas y vea las salidas.

¡Solo asegúrese de detach sus datos después de que haya terminado!

Cuestiones relacionadas