2012-03-24 15 views
10

Ho seguito la discussione su HERE e sono curioso di sapere il motivo per cui sta usando <<- visto di buon occhio in R. Che tipo di confusione intende provocare?Perché si usa `<< -` disapprovato e come posso evitarlo?

Vorrei anche alcuni consigli su come posso evitare <<-. Io uso il seguente abbastanza spesso. Per esempio:

### 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))) 

Quello che voglio raggiungere è quello di spostare ogni numero dalla 1, vale a dire tutti i 2s diventeranno 1s, tutti i 3s saranno disponibili 2 ecc Pertanto, tutti n sarebbe venuto n-1. Ho raggiungere questo dal seguente:

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

In questo caso, come posso evitare di <<-? Idealmente vorrei essere in grado di pipe i risultati sapply in un'altra variabile lungo le linee di:

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

Vedi anche http://stackoverflow.com/questions/14166207/avoiding-global-variables-in-r/14166812 # 14166812 –

risposta

16

Primo punto

<<- è NON all'operatore di assegnare alla variabile globale. Prova ad assegnare la variabile nell'ambiente padre più vicino. Così, per esempio, questo renderà la confusione:

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

poi,

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

Secondo punto

è possibile farlo utilizzando 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}) 

Ma

semplicemente, questo è sufficiente:

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

Grazie per le alternative al mio codice. Molto apprezzato. Potresti elaborare la funzione di riduzione? Non sono molto chiaro riguardo al suo flusso logico anche dopo aver letto? Riduci. Posso capire che stai cercando di creare una funzione all'interno di Riduci con 2 variabili. Per tutti in 'a' dove' == 'a' b' meno '1'.Seguendo questo c'è un '; a' e la sintassi rimanente di cui mi sono perso – JackeJR

+0

' Reduce' è anche conosciuta come 'Fold', che è un metodo popolare nella programmazione funzionale. Ecco una semplice spiegazione. [wikipedia] (http://en.wikipedia.org/wiki/Fold_ (funzione di ordine superiore)) – kohske

+0

Per ulteriori discussioni, consultare: http://stackoverflow.com/a/10904810/2338862 – Thomas

5

Si può pensare di <<- come assegnazione globale (circa, perché i punti come kohske fuori si assegna per l'ambiente superiore a meno che il nome della variabile esiste in un ambiente più prossimale). Esempi del perché questo è male sono qui:

Examples of the perils of globals in R and Stata

+0

+1 per il collegamento. Grazie! – JackeJR

+1

Ha più senso pensare a << << - 'come un compito che ispeziona gli ambienti che racchiudono poiché' x << - value' è equivalente a 'assign ('x', value, inherits = TRUE)'. Lo uso per scopi completamente diversi da 'assign ('x', value, pos = .GlobalEnv)'. –

Problemi correlati