2013-05-05 4 views
5

Ich muss einen zusätzlichen Namen für my_function (i, x) erstellen (wobei i eine ganze Zahl von 1 bis 25 sein kann). Ich mag es wie diesZusätzlicher Funktionsname, aber mit weniger Argumenten

  • my_function1 (x) Sames als my_function (1, x)
  • my_function2 (x) Sames als my_function (2, x)
  • my_function3 (x) sames arbeiten wie my_function (3, x)
  • ...
  • my_function25 (x) sames als my_function (25, x)

Eine Möglichkeit, dies würde zu tun erreichen sein:

my_function1 <- function (x) my_function(1, x) 
my_function2 <- function (x) my_function(2, x) 
my_function3 <- function (x) my_function(3, x) 
... 

Aber da es 25 von ihnen gibt, wäre es vernünftig, es in einer Schleife zu machen. Dafür habe ich versucht:

for(i in 1:25){ 
    assign(paste("my_function",i,sep=""),function(x) my_function(i,x)) 
} 

, aber es funktioniert nicht, da i durch Bezugnahme und am Ende ging das Ergebnis

war
  • my_function1 (x) Sames als my_function (25, x)
  • my_function2 (x) Sames als my_function (25, x)
  • my_function3 (x) Sames als my_function (25, x)
  • ...

Wie kann ich "i" nach Wert übergeben? Oder vielleicht gibt es einen anderen Weg ...

Warum sollte ich das tun? Ich verbessere irgendjemand anderes R-Paket in Bezug auf die Effizienz, aber gleichzeitig muss ich es mit der alten Version kompatibel sein.

+0

Willkommen bei SO. Sie werden feststellen, dass Sie bessere Antworten erhalten, wenn Sie das nächste Mal ein [reproduzierbares Beispiel] (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example) veröffentlichen.Oder dieses Mal, da du deinen Post editieren kannst :-) –

+0

@ AriB.Friedman Danke :) Das nächste Mal werde ich daran denken, reproduzierbares Beispiel zu schreiben. Curry sieht sehr sauber aus und es funktioniert perfekt, aber in diesem Fall würde ich lieber einige Standard-R-Funktionen verwenden, da ich wirklich keine zusätzlichen Pakete installieren möchte. – LukaszJ

Antwort

6

Dies wird Curry genannt und ist ein Teil der funktionalen Programmierung.

library(functional) 

myf <- function(a,x) cat(a,x,"\n") 
myf1 <- Curry(myf, a=1) 
myf1(5) 
for(i in seq(25)) assign(paste0("myf",i), Curry(myf,a=i)) 
> myf15(5) 
15 5 

Ich denke, es ist eine wichtige Frage hier wie zu warum Sie dies tun wollen würde. Das scheint genau die Art von Dingen zu sein, für die Sie Argumente brauchen, für die es nicht viele verwandte Funktionen gibt.

+0

+1 Ich wusste nichts über Curry (ich habe noch so viel zu lernen!). Vielen Dank. –

+0

@ SimonO101 Es gibt mehr als eine Straße nach Dublin. Nette Verwendung von 'bquote'. –

+0

Allerdings ist das, was ich oben zurückgegeben habe, nicht syntaktisch gültig! Ich habe nur das Kopieren aus der Frage kopiert. –

2

Ich denke bquote hier helfen:

for(i in 1:2){ 
    assign(paste("my_function",i,sep=""), bquote(function(x) my_function(i = .(i) , x))) 
} 

>my_function2 
# function(x) my_function(i = 2L, x) 

Aber der Punkt steht noch - warum sollten Sie wollen, dies zu tun?

+0

Nun, ich verbessere jemand anderes R-Paket in Bezug auf Effizienz, aber zur gleichen Zeit muss ich es mit der alten Version kompatibel sein. Danke für die Lösung! – LukaszJ

4

Nun, Sie können das gleiche Ergebnis erreichen, mit base Funktionen auch.

Der Trick ist zu zwingen (force) die Auswertung von i bei jeder Iteration und weisen Sie Ihre Funktion in der .Globalenv (oder der Umgebung, die Sie mögen)

my_function <- function(a, b) a + b 


lapply(1:10, function(i) { 
    force(i) 
    assign(paste0("my_function", i), function(x) my_function(i, x), envir = .GlobalEnv) 
} 
     ) 


my_function1(10) 
## [1] 11 

my_function9(10) 
## [1] 19 
+0

+1 nette Lösung. –

+0

@ SimonO101 danke !!! Ich liebe die "Es gibt mehr als eine Art, es zu tun" -Philosophie in R, ich war mir auch "Curry" nicht bewusst und dachte in diesem Fall nicht an "bquote". thanks – dickoa

+2

Es gibt mehr als einen Weg, es zu tun, aber es gibt nur einen Weg, es nicht zu tun, und ich denke wirklich, das ist etwas, was nicht getan werden sollte ... Ich wette, die nächste Frage aus dem OP wird sein wie rufe 'my_function $ {i}()' für einen Wert von 'i' auf? – Spacedman