ich in der folgenden Konstruktion interessiert bin:Wie Kette, die eine Liste von binären Funktionen
Nehmen wir an, ich eine Liste von n
binären Funktionen und einen Vektor von n+1
Argumente haben. Für Argumente können aus Gründen
flist = c(`+`,`-`)
args = 1:3
Was verwenden würde ich die folgende Funktionsaufruf f2 (f1 (x1, x2), x3), dh in diesem Beispiel
`-`(`+`(1,2),3)
wo der Rückgabewert zu tun ist, zu erstellen der Vektor der kumulierten Ergebnisse wird
[1] 3 0
ich habe eine Lösung der Form
f = function(x,op,res = NULL){
if(is.null(res)){
res = op[[1]](x[1],x[2])
x = x[-1]
} else{
res = c(res,op[[1]](res[length(res)],x[1]))
}
if(length(op) == 1) res
else f(x[-1],op[-1],res)
}
, so dass ist gibt die richtige Antwort
f(x,flist)
[1] 3 0
aber es fühlt sich nicht besonders R wie oder elegant. Gibt es einen besseren Weg, dies zu tun? Ich vermute, dass meine Implementierung auch nicht die effizienteste ist, und daher wäre auch alles, was effizienter ist, von Interesse.
Hat jemand irgendwelche Ideen?
Alternativ, wenn die Anforderung nach kumulativen Antworten zu entspannen, d. H. Nur die endgültige Antwort 0
zurückgegeben wurde, gibt es eine schöne R Möglichkeit, dies zu tun? Ich weiß, dass ich meine f
ändern könnte, um mit dieser Alternative umzugehen, aber wenn es einen Weg gibt, dies bereits zu tun, würde ich gerne über beide Optionen hören.
Edit:
Ein Kommentar vorgeschlagen, eine for
Implementierung Schleife, so dass wir
falt = function(x,op){
res = numeric(length(op))
res[1] = op[[1]](x[1],x[2])
for(i in 2:length(res)) res[i] = op[[i]](res[i-1],x[i+1])
res
}
haben könnte, die effizienter macht trainieren. Aber ich denke immer noch, dass es einen besseren Weg geben muss, dies zu tun.
Warum verwenden Sie Rekursion und wachsen 'res'? Verwenden Sie einfach eine "for" -Schleife und weisen Sie res die endgültige Größe zu. – Roland
Es gab keinen besonderen Grund dafür, ich lerne gerade Scala und so ist mir die Rekursion sehr wichtig. Eine Implementierung, die eine For-Schleife verwendet, funktioniert in Ordnung und ist schneller, und in R ist die tiefe Rekursion schlecht, also ein vernünftiger Vorschlag. Es fühlt sich so an, als ob eine nette Reduktionsoperation dafür existieren sollte. Persönlich meckern, aber ich bin auch kein Fan von 'for' Loops in R aufgrund seiner funktionalen und vektorisierten Natur. Ich hatte auch vorübergehend die Torheit der wachsenden Objekte in R vergessen. – jamieRowen
Möchten Sie die Reduce-Dokumentation ausprobieren? Suche nach Iterate ... es könnte helfen – chinsoon12