Eine anwendungsbasierte Funktion vorzeitig beenden (ähnlich wie break?)

8

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.

    
user602319 06.02.2011, 21:56
quelle

3 Antworten

18

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

%Vor%

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.

    
Joris Meys 07.02.2011 11:00
quelle
1

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.

%Vor%
J. Win. 06.02.2011 22:57
quelle
0

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.

    
Konrad KB 28.02.2011 09:10
quelle

Tags und Links