Ich suche nach einer Möglichkeit, eine Anwendungsfunktion zu einem bestimmten Zeitpunkt vorzeitig zu beenden. Verwenden Sie eine for-Schleife, etwa wie folgt:
%Vor% Ich möchte diese Funktion mit einer Ableitung von apply
umschreiben. Insbesondere wird die Bewertung der ersten Person mit erhöhter Fitness beendet, wodurch die Kosten für die Berücksichtigung der restlichen Bevölkerung vermieden werden.
Ich schätze, dass Sie die apply
-Familie und ihren Zweck nicht wirklich verstehen. Im Gegensatz zu der allgemeinen Idee sind sie nicht das Äquivalent von for
-loop. Man kann sagen, dass die meisten for
-loops dem apply
entsprechen, aber das ist eine andere Sache.
Apply
funktioniert genau so, wie es heißt: Es wendet sequentiell eine Funktion auf eine Anzahl ähnlicher Argumente an und gibt das Ergebnis zurück. Daher können Sie definitionsgemäß nicht aus einer Bewerbung ausbrechen. Da Sie nicht mehr in der globalen Umgebung arbeiten, können Sie grundsätzlich keine globalen Zähler behalten, nach jeder Ausführung eine Bedingung überprüfen und die Schleife anpassen. Sie können auf die globale Umgebung zugreifen und sogar Variablen mit assign
oder <<-
ändern, aber das ist ziemlich gefährlich.
Um den Unterschied zu verstehen, lesen Sie apply(1:3,afunc)
nicht als for(i in 1:3) afunc(i)
, sondern als
in einer (Block-) Anweisung. Das reflektiert besser, was Sie genau machen. Ein Äquivalent für break
in apply
macht einfach keinen Sinn, da es mehr ein Code-Block als eine Schleife ist.
Abgesehen davon, dass Ihr Beispielcode funktioniert *
Ich denke, dies ist ein klarer Fall, in dem eine Schleife die richtige Wahl ist. Obwohl R eine Funktion auf einen ganzen Vektor von Variablen anwenden kann [EDIT: aber Sie müssen entscheiden, was sie sind, bevor Sie anwenden], würde ich in diesem Fall eine while
-Schleife verwenden, um unnötige Wiederholungen zu vermeiden. Vorbehalt: Ich weiß, dass for
loops im Vergleich zu apply
in Timing-Tests verglichen haben, aber ich habe keinen ähnlichen Test für while
gesehen. Sehen Sie sich einige der Optionen unter Ссылка an.
Ich war auch auf der Suche nach einer Möglichkeit, früh aus einem ausbrechen Anwenden-basierte Schleife, und diesen Thread gefunden.
Obwohl einige Leute behaupten, dass die Anwendung als zu betrachten ist "Block-Code" statt einer "Schleife", ich denke immer noch, es wäre nützlich, um eine Möglichkeit zu haben, daraus auszubrechen. Der Grund ist dass die anwendungsbasierten Funktionen viel schneller auszuführen scheinen, etwas 10-100 mal schneller als eine for-Schleife. Viele Male Ich habe einfache Snippets in for-Schleifen ausgeführt, die danach nicht ausgeführt werden mehr als ein paar Minuten, während die Anwendung scheint das gleiche zu erhalten Arbeit erledigt in wenigen Sekunden.
Tags und Links r