Die Dokumentation sagt
vapply
ähneltsapply
, hat jedoch einen vorgegebenen Rückgabewert, sodass die Verwendung [...] sicherer sein kann.
Könnten Sie bitte erläutern, warum es im Allgemeinen sicherer ist, und vielleicht Beispiele nennen?
PS: Ich kenne die Antwort und vermeide sie bereits sapply
. Ich wünschte nur, es gäbe hier auf SO eine nette Antwort, damit ich meine Kollegen darauf hinweisen kann. Bitte keine Antwort "Handbuch lesen".
Antworten:
Wie bereits erwähnt, werden
vapply
zwei Dinge ausgeführt:Der zweite Punkt ist der größere Vorteil, da er hilft, Fehler zu erkennen, bevor sie auftreten, und zu robusterem Code führt. Diese Rückgabewertprüfung kann separat durchgeführt werden, indem
sapply
gefolgt von verwendet wirdstopifnot
, um sicherzustellen, dass die Rückgabewerte mit Ihren Erwartungen übereinstimmen. Sie ist jedochvapply
etwas einfacher (wenn sie eingeschränkter sind, da der benutzerdefinierte Fehlerprüfcode nach Werten innerhalb von Grenzen usw. suchen kann). ).Hier ist ein Beispiel, wie Sie
vapply
sicherstellen können, dass Ihr Ergebnis den Erwartungen entspricht. Dies entspricht etwas, an dem ich gerade beim PDF-Scraping gearbeitet habe, wofindD
einRegexZum Abgleichen eines Musters in Rohtextdaten (z. B. hätte ich eine Listesplit
nach Entitäten und einen regulären Ausdruck zum Abgleichen von Adressen innerhalb jeder Entität. Gelegentlich wurde das PDF nicht in der richtigen Reihenfolge konvertiert, und es gab zwei Adressen für eine Entität Entität, die Schlechtigkeit verursachte).Wie ich meinen Schülern erzähle, besteht ein Teil des Werdens eines Programmierers darin, Ihre Einstellung von "Fehler sind ärgerlich" zu "Fehler sind mein Freund" zu ändern.
Eingaben
mit der Länge Null Ein verwandter Punkt ist, dass bei einer Eingangslänge von Null
sapply
unabhängig vom Eingabetyp immer eine leere Liste zurückgegeben wird. Vergleichen Sie:Mit
vapply
haben Sie garantiert einen bestimmten Ausgabetyp, sodass Sie keine zusätzlichen Prüfungen für Eingaben mit der Länge Null schreiben müssen.Benchmarks
vapply
kann etwas schneller sein, da es bereits weiß, in welchem Format die Ergebnisse erwartet werden sollen.quelle
Durch die zusätzlichen Tastenanschläge können
vapply
Sie später Zeit beim Debuggen verwirrender Ergebnisse sparen. Wenn die von Ihnen aufgerufene Funktion unterschiedliche Datentypen zurückgeben kann,vapply
sollte sie auf jeden Fall verwendet werden.Ein Beispiel, das mir
sqlQuery
in den Sinn kommt, ist dasRODBC
Paket. Wenn beim Ausführen einer Abfrage ein Fehler auftritt, gibt diese Funktion einencharacter
Vektor mit der Nachricht zurück.tnames
Angenommen, Sie möchten einen Vektor von Tabellennamen durchlaufen und den Maximalwert aus der numerischen Spalte 'NumCol' in jeder Tabelle auswählen mit:Wenn alle Tabellennamen gültig sind, würde dies zu einem
numeric
Vektor führen. Wenn sich jedoch einer der Tabellennamen in der Datenbank ändert und die Abfrage fehlschlägt, werden die Ergebnisse in den Modus gezwungencharacter
. Die Verwendungvapply
mitFUN.VALUE=numeric(1)
stoppt jedoch den Fehler hier und verhindert, dass er irgendwo auf der ganzen Linie auftaucht - oder schlimmer noch, überhaupt nicht.quelle
Wenn Sie immer möchten, dass Ihr Ergebnis etwas Besonderes ist ... z. B. ein logischer Vektor.
vapply
stellt sicher, dass dies geschieht,sapply
tut dies aber nicht unbedingt.quelle
logical(1)
in diesem Fall, da FALSE so aussieht, als würde es eine Option auf "OFF" setzen, anstatt einen Typ anzugeben