Wie kann ich verhindern, dass eine Bibliothek Funktionen maskiert?

8

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.

  1. Es ist möglich zu verhindern, dass einige Funktionen maskiert werden?
  2. Ist es möglich, "die Maskierungsfunktion" (z. B. xgboost::slice ) mit einer frühen importierten Funktion (z. B. dplyr::slice ) zu maskieren?

Hinweise

  • Ich frage NICHT, wie ich die Warnmeldung deaktivieren kann.
  • Ich bin NICHT gefragt, wie man die maskierten Funktionen verwendet.
H. Shindoh 15.10.2016, 21:18
quelle

3 Antworten

10
  
  1. Es ist möglich zu verhindern, dass einige Funktionen maskiert werden?
  2.   

Ich glaube nicht, aber ich könnte falsch liegen. Ich bin mir nicht sicher, wie das aussehen würde

  
  1. Ist es möglich, "die Maskierungsfunktion" (z. B. xgboost :: slice) mit einer frühen importierten Funktion (z. B. dplyr :: slice) zu maskieren?
  2.   

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

%Vor%

und dann können Sie slice verwenden, als wäre es die dplyr-Version (weil es jetzt ist).

    
Dason 15.10.2016, 21:28
quelle
14

Die nächste Version von R hat dies in den NEWS {.Rd } file (zitiert aus dem NEWS file post-build):

%Vor%

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.

    
Dirk Eddelbuettel 15.10.2016 22:08
quelle
5

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.

    
lionel 14.11.2017 19:25
quelle

Tags und Links