2015-07-28 7 views
6

den folgenden CodeR: tiefe Kopie ein Funktionsargument

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

Jedoch betrachte, was ich will, ist

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

Falls Sie sich fragen, warum ich dies tun wollen Sie diesen Code in Erwägung ziehen könnte - Die Anwendung ist ein Modell mit mehreren Dekrementierungen. Die Diagonalen einer Übergangsmatrix sind die Summe der anderen Dekremente in dieser Reihe. Ich möchte die Verringerungen definieren Ich brauche als die anderen Funktionen berechnen diese Verringerungen verwenden. In diesem Fall muss ich nur uxt01 und uxt10 und von diesen möchte ich die Funktionen uxt00 und uxt11 produzieren. Ich wollte etwas, das zu höheren Dimensionen skaliert.

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

Können Sie genauer erklären, warum Sie dies tun wollen? – joran

+3

Dies hat nichts mit tief oder flach Kopieren zu tun. –

Antwort

9

Dies kann j manuell durch die Zuordnung des Standardausdruckes für die formalen Parameter erfolgen, nachdem die Funktion zu erstellen:

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 

Dies ist nur möglich, weil R eine wunderbare Sprache und bietet Ihnen die vollständige Lese-/Schreibzugriff auf alle drei spezielle Eigenschaften von Funktionen, die da sind:

  1. der Parsing-Baum, der den Körper umfasst: body().
  2. Die formalen Parameter und ihre Standardwerte (die selbst Bäume analysieren sind): formals().
  3. Die umschließenden Umgebung (die verwendet wird, Verschlüsse zu implementieren): environment().
5

Weisen Sie ihn an eine andere Variable, wenn Sie i wiederverwenden möchten:

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

natürlich sollten Sie diese Variable nicht lassen Sie einfach herumliegen - das wie das Original als schlecht Code. Sie können es auf die Funktion machen „private“, obwohl, durch Definieren beide zusammen in einer lokalen Umgebung:

f = local({ 
    default_value = i 
    function(x, j = default_value) 
     x * j 
}) 
Verwandte Themen