2012-03-24 15 views
10

Seguí la discusión sobre HERE y estoy curioso por qué está usando <<- mal visto en R. ¿Qué tipo de confusión causará?¿Por qué está usando `<< -` mal visto y cómo puedo evitarlo?

También me gustaría algunos consejos sobre cómo puedo evitar <<-. Uso lo siguiente con bastante frecuencia. Por ejemplo:

### Create dummy data frame of 10 x 10 integer matrix. 
### Each cell contains a number that is between 1 to 6. 
df <- do.call("rbind", lapply(1:10, function(i) sample(1:6, 10, replace = TRUE))) 

Lo que quiero lograr es cambiar cada número por 1, es decir todos los 2s se convertirán en 1s, todos los 3s se vienen 2, etc. Por lo tanto, todos los n se procedería n-1. Puedo lograr esto mediante la siguiente:

df.rescaled <- df 
sapply(2:6, function(i) df.rescaled[df.rescaled == i] <<- i-1)) 

En este caso, ¿cómo puedo evitar <<-? Idealmente me gustaría ser capaz de canalizar los resultados sapply en otra variable a lo largo de las líneas de:

df.rescaled <- sapply(...) 
+0

Véase también http://stackoverflow.com/questions/14166207/avoiding-global-variables-in-r/14166812 # 14166812 –

Respuesta

16

Primer punto

<<- es NO que el operador asigne a la variable global. Intenta asignar la variable en el entorno principal más cercano. Así, por ejemplo, esto hará que la confusión:

f <- function() { 
    a <- 2 
    g <- function() { 
     a <<- 3 
    } 
} 

entonces,

> a <- 1 
> f() 
> a # the global `a` is not affected 
[1] 1 

Segundo punto

puede hacerlo mediante el uso de Reduce:

Reduce(function(a, b) {a[a==b] <- a[a==b]-1; a}, 2:6, df) 

o apply

apply(df, c(1, 2), function(i) if(i >= 2) {i-1} else {i}) 

Pero

palabras, esto es suficiente:

ifelse(df >= 2, df-1, df) 
+0

Gracias por las alternativas a mi código. Muy apreciado. ¿Podría explicar la función Reducir? No estoy muy claro sobre su flujo lógico incluso después de leer? Reducir. Entiendo que está intentando crear una función dentro de Reducir con 2 variables. Para todos en 'a' donde' '==' a 'b' menos' 1'.Siguiendo que hay un '; a' y la sintaxis restante de la cual estoy perdido – JackeJR

+0

' Reduce' también se conoce como 'Fold', que es un método popular en la programación funcional. Aquí hay una explicación simple. [wikipedia] (http://en.wikipedia.org/wiki/Fold_ (higher-order_function)) – kohske

+0

Para más información, ver: http://stackoverflow.com/a/10904810/2338862 – Thomas

5

Se puede pensar en <<- como cesión global (aproximadamente, debido a puntos como kohske a cabo se asigna al medio ambiente superior a menos el nombre de la variable existe en un entorno más proximal). Los ejemplos de por qué esto es malo está aquí:

Examples of the perils of globals in R and Stata

+0

+1 para el enlace. ¡Gracias! – JackeJR

+1

Tiene más sentido pensar '<< -' como una tarea que inspecciona los entornos adjuntos, ya que 'x << - value' es equivalente a' assign ('x', value, inherits = TRUE) '. Lo uso para fines completamente diferentes que 'assign ('x', value, pos = .GlobalEnv)'. –

Cuestiones relacionadas