Eine typische Situation ist die folgende:
%Vor% Wenn ich die Bibliothek xgboost
importiere, wird die Funktion slice
von dplyr
maskiert, und ich muss dplyr::slice
schreiben, obwohl ich niemals xgboost::slice
explizit verwende.
Die naheliegende Lösung für dieses Problem besteht darin, xgboost
vor dplyr
zu importieren. Aber es ist verrückt, alle Bibliotheken zu importieren, die die Funktionen von dplyr
im Voraus beeinflussen können. Außerdem tritt dieses Problem oft auf, wenn ich caret
library verwende. Nämlich train
function importiert automatisch benötigte Bibliotheken und einige Funktionen werden zu der Zeit maskiert.
xgboost::slice
) mit einer frühen importierten Funktion (z. B. dplyr::slice
) zu maskieren? Hinweise
- Es ist möglich zu verhindern, dass einige Funktionen maskiert werden?
Ich glaube nicht, aber ich könnte falsch liegen. Ich bin mir nicht sicher, wie das aussehen würde
- Ist es möglich, "die Maskierungsfunktion" (z. B. xgboost :: slice) mit einer frühen importierten Funktion (z. B. dplyr :: slice) zu maskieren?
Wenn Sie gerade nachfragen oder in einer interaktiven Sitzung verwenden möchten, können Sie immer slice
als die Funktion definieren, die Sie tatsächlich so verwenden möchten
und dann können Sie slice
verwenden, als wäre es die dplyr-Version (weil es jetzt ist).
Die nächste Version von R hat dies in den NEWS {.Rd } file (zitiert aus dem NEWS
file post-build):
Dort verwiesener Text aus dem Handbuch ist hier ( im rohen texi Format) .
So bald können wir. Im Moment kann man das nicht, und das ist ein großer Ärger, besonders wenn Funktionen von Base R-Paketen maskiert werden: lag()
, filter()
, ...
Wir haben den Begriff antisocial für dieses Verhalten in der Vergangenheit verwendet. Ich denke nicht, dass es zu stark ist.
Um das Problem zu illustrieren, hier ist ein Codeausschnitt, den ich vor einem Jahrzehnt geschrieben habe (und ihn in der jetzt verschwundenen R Graph Gallery veröffentlicht hatte), der einen cleveren und schnellen Weg nutzt, um einen gleitenden Durchschnitt zu berechnen:
%Vor% Wenn du library(dplyr)
wie in einer interaktiven Sitzung machst, bist du tot im Wasser, denn filter()
ist jetzt etwas völlig anderes. Nicht nett.
Die Lösung besteht darin, Ihren Namespace so zu verwalten, wie es in anderen Sprachen üblich ist. Sie können dplyr-Funktionen selektiv importieren:
%Vor%Aus praktischen Gründen können Sie auch das gesamte Paket importieren und Funktionen aus zuvor angehängten Paketen selektiv neu importieren:
%Vor%R hat ein großartiges Modulsystem und das Anbringen ganzer Namespaces ist besonders praktisch für den interaktiven Gebrauch. Es erfordert ein wenig manuelle Anpassung, wenn die Präferenzen der Paketautoren nicht mit denen übereinstimmen.
Beachten Sie, dass Sie in Paketen und langfristigen Wartungsskripten selektive Importe bevorzugen sollten, teilweise weil es schwer ist, neue exportierte Funktionen in zukünftigen Versionen vorherzusagen. Wenn mehrere Pakete in großen Mengen importiert werden, kann dies im Laufe der Zeit zu einer unerwarteten Maskierung führen.
Generell ist es eine gute Regel, sich auf ein einzelnes angehängtes Paket zu verlassen und den Rest selektiv zu importieren. Zu diesem Zweck könnte das Paket tidyverse
nützlich sein, wenn Sie ein starker Ordnungsbenutzer sind, da es einen einzelnen Importpunkt für mehrere Pakete bereitstellt.
Schließlich scheint es aus Ihrer Frage, dass Sie denken, dass die Reihenfolge der angehängten Pakete Nebenwirkungen innerhalb anderer Pakete haben könnte. Dies ist kein Grund zur Sorge, da alle Pakete ihre eigenen Kontexte haben. Das Importschema wirkt sich nur auf Ihr Skript aus.
Tags und Links r