2015-07-28 13 views
6

Si consideri il seguente codiceR: copia completa di un argomento di funzione

i = 3 
j = i 
i = 4 # j != i 

Tuttavia, quello che voglio è

i = 3 
f <- function(x, j=i) 
    x * j 
i = 4 
f(4) # 16, but i want it to be 12 

Nel caso in cui vi state chiedendo perché voglio fare questo si potrebbe considerare questo codice - l'applicazione è un modello a decrementi multipli. Le diagonali di una matrice di transizione sono la somma degli altri decrementi in quella riga. Vorrei definire i decrementi di cui ho bisogno piuttosto che calcolare le altre funzioni usando quei decrementi. In questo caso, ho solo bisogno di uxt01 e uxt10 e da questi voglio produrre le funzioni uxt00 e uxt11. Volevo qualcosa che si adattasse alle dimensioni superiori.

Qxt <- matrix(c(uxt00=function(t=0,x=0) 0, 
       uxt01=function(t=0,x=0) 0.05, 
       uxt10=function(t=0,x=0) 0.07 
       uxt11=function(t=0,x=0) 0), 2, 2, byrow=TRUE) 

Qxt.diag <- function(Qxt) { 
    ndecrements <- length(Qxt[1,]) 
    for(index in seq(1, N, N+1)) { # 1, 4 
     Qxt[[index]] <- function(t=0, x=0, i=index, N=ndecrements) { 
      row <- ceiling(index/ndecr) 
      row.decrements <- seq((row - 1)*N + 1, (row)*N) 
      other.decrements <- row.decrements[which(row.decrements != i] 
      -sum(unlist(lapply(Qxt.fns[[other.decrements]], 
       function(f) f(t,x)))) 
     } 
    } 
    Qxt.fns 
} 
+0

Puoi spiegare in modo più completo perché vuoi farlo? – joran

+3

Questo non ha nulla a che fare con la copia profonda o superficiale. –

risposta

9

questo può essere fatto assegnando l'espressione di default per il parametro formale j manualmente, dopo aver creato la funzione:

i <- 3; 
f <- function(x,j) x*j; 
f; 
## function(x,j) x*j 
formals(f); 
## $x 
## 
## 
## $j 
## 
## 
formals(f)$j <- i; 
f; 
## function (x, j = 3) 
## x * j 
formals(f); 
## $x 
## 
## 
## $j 
## [1] 3 
## 
i <- 4; 
f(4); 
## [1] 12 

Questo è possibile solo perché R è un linguaggio impressionante e si fornisce una completa lettura/Scrive l'accesso a tutte e tre le proprietà speciali delle funzioni, che sono:

  1. L'albero di parsing che comprende il corpo: body().
  2. I parametri formali e i loro valori di default (che sono essi stessi alberi di analisi): formals().
  3. L'ambiente di chiusura (utilizzato per implementare chiusure): environment().
5

Assegnare ad una variabile diversa se si vuole riutilizzare i:

default_value = i 
f = function(x, j = default_value) 
    x * j 
i = 4 
f(4) # 12 

, naturalmente, non si deve lasciare questa variabile solo in giro - che è così male come l'originale codice. Puoi renderlo "privato" alla funzione, tuttavia, definendo entrambi insieme in un ambiente locale:

f = local({ 
    default_value = i 
    function(x, j = default_value) 
     x * j 
}) 
Problemi correlati