3

übergeben Ich arbeite an einer nichtlinearen Optimierung, mit der constrOptim.nl aus das alabama Paket. Allerdings ist mein Problem eher auf Argumente (und den Punkt-Punkt-Punkt (Ellipse/"...") und vielleicht do.call) - so gebe ich zuerst ein allgemeines Beispiel und später beziehen Sie sich auf die constrOptim.nl Funktion.R - Wie mit dem Punkt-Punkt-Punkt (Ellipse/"...") mit mehreren nachfolgenden Funktionen zu behandeln - dh nur einige der Variablen

Angenommen, ich habe folgende Funktionen - von dem ich nur die second und third aber nicht die first bearbeiten.

first<-function (abc, second, third, ...){ 
second(abc,...) 
third(abc,...) 
} 

second<- function(abc, ttt='nothing special'){ 
print(abc) 
print(ttt) 
} 

third<- function(abc, zzz="default"){ 
print(abc) 
print(zzz) 
} 

Der Ausgang ich will, ist das gleiche ich bekommen würde, wenn ich laufe nur

second("test", ttt='something special') 
third("test", zzz="non-default") 

Diese

"test" 
"something special" 
"test" 
"non-default" 

jedoch ist, den Code unten, dies nicht zu tun, nicht funktioniert.

first("test",second=second, third=third, ttt='something special',zzz="non-default") 

Wie kann ich den Anruf oder die second und third Funktion ändern es funktioniert?

http://www.r-bloggers.com/r-three-dots-ellipsis/ Hier fand ich einen Hinweis, dass do.call mir helfen konnte, aber im Moment bin ich nicht in der Lage zu verstehen, wie es funktionieren sollte.

Ich kann die first Funktion ändern, da dies die constrOptim.nl in meinem speziellen Problem ist - und es ist so ausgelegt, vorbei mehr Argumente auf verschiedene Funktionen fähig zu sein. Allerdings kann ich die second und third Funktion ändern - wie sie sind die Einschränkungen und die Funktion, die ich minimieren möchte. Natürlich kann ich auch den Aufruf der Funktion ändern.

So spezielleren, hier ist mein spezielles Problem zu sein: Ich führe ein Maximum-Likelihood-Schätzung mit nichtlinearen Einschränkungen:

minimize <- function(Param,VARresiduals){ 
    #Blahblah 
    for (index in 1:nrow(VARreisduals)){ 
    #Likelihood Blahbla 
    } 
    return(LogL) 
} 
heq<-function(Param,W){ 
    B<-Param[1:16] 
    restriction[1]<-Lrestriction%*%(diag(4)%x%(solve(W))%*%as.vector(B)) 
    restriction[2:6]<-#BlablaMoreRestrictions 
    return(restriction) 
} 

Jetzt nenne ich die constrOptim.nl ...

constrOptim.nl(par=rnorm(20), fn=minimize,hin=NULL heq=heq,VARresiduals,W) 

... aber bekomme den gleichen Fehler, wie ich erhalte, wenn ich die first Funktion oben anrufe - so etwas wie: "Fehler im zweiten (abc, ...): unbenutztes Argument (zzz =" non-default ").

Wie kann ich minimize und heq oder den Anruf ändern? :) Vielen Dank im Voraus

aktualisieren nach der Post als Duplikat markiert wurde: Die Antwort auf die im Zusammenhang Post ändert sich die first Funktion in meinem Beispiel - wie setzt sie eine do.call dort, dass die anderen Funktionen aufruft . Allerdings kann ich die erste Funktion in meinem Beispiel nicht ändern, da ich die constrOptim.nl eine Vielzahl von verschiedenen Funktionen arbeiten lassen möchte. Gibt es eine andere Art und Weise?

+0

@baptiste Bitte beachten Sie mein Update. Vielleicht liege ich falsch, aber das verlinkte Duplikat scheint mein Problem nicht zu lösen. –

+0

Just FYI der Begriff für eine Funktion mit einer variablen Anzahl von Argumenten (z. B. hat die Ellipse in R) ist eine Variadic-Funktion. Nützlich für zukünftige Google-Fu :) –

Antwort

0

Die Lösung, die ich mir ausgedacht habe, ist nicht sehr elegant, aber es funktioniert.

second_2<- function(abc, extras){ 
    a<-extras[[1]] 
    print(abc) 
    print(a) 
} 

third_2<- function(abc, extras){ 
    a<-extras[[2]] 
    print(abc) 
    print(a) 
} 

extras<-list() 
extras[[1]]<-'something special' 
extras[[2]]<-"non-default" 
extras 


first("test",second=second_2, third=third_2, extras) 

überraschenderweise auch der folgende Code funktioniert, aber mit einem etwas anderen Ergebnis

first("test",second=second, third=third, extras) 

immerhin Werte Standardeinstellung ist jetzt ein wenig ungeschickt, aber nicht unmöglich.

Verwandte Themen