2016-07-10 12 views
5

Gibt es eine Möglichkeit, eine Funktion aus einem importierten Paket auszuschließen. Zum Beispiel verwende ich fast alle von dplyr, aber vor kurzem haben sie eine neue Funktion namens recode hinzugefügt, die eine Funktion überschreibt, die ich von einem proprietären Paket habe (an dem ich keine Änderungen vornehmen kann).Eine Funktion aus dem importierten Paket entfernen (oder ausschließen)

Gibt es eine Möglichkeit, die s3-Funktion aus dem Namespace auszuschließen, so dass es nur die Funktion aus meinem Paket sieht und die von dplyr ignoriert.

Ich bin mir bewusst, dass wir einzelne Funktionen aus einem Paket mit Leichtigkeit importieren können, aber in diesem Fall möchte ich ausschließen - nur eine.

+0

Wenn Sie das Paket, das Sie nach 'dplyr' wollen laden sollte nicht Deine gewünschte Funktion maskiere den 'dplyr'? –

+0

Ich habe das versucht, aber es funktioniert nicht, weil das proprietäre Paket seine Funktionen nicht richtig exportiert. –

+0

Ich sehe. Also würde ich vorschlagen, nur dplyr auf GitHub zu forkieren und die Funktion zu entfernen, die du nicht willst, aber wenn du sagst, dass sie es kürzlich hinzugefügt haben, warum benutzt du nicht einfach die neueste Version, die nicht 'recode' hat? –

Antwort

9

R 3.3.0 oder höher unterstützen jetzt "import all but x,y,z from foo" statements:

\item The \code{import()} namespace directive now accepts an 
    argument \code{except} which names symbols to exclude from the 
    imports. The \code{except} expression should evaluate to a 
    character vector (after substituting symbols for strings). See 
    Writing R Extensions. 

Methinks, das ist genau das, was Sie hier wollen, und wollen die meisten Menschen wollen, die nicht beabsichtigen dplyr clobber über Funktionen haben aus das Statistikpaket, das mit R enthalten ist, wie filter oder lag.

Edited basierend auf spätere Diskussion in den Kommentaren:

Beispiel Anwendungsbeispiel in der Datei NAMESPACE pro Section 1.5.1 of WRE ist wie folgt:

import(dplyr, except = c(recode, lag, filter)) 
+1

dies in der Regel sehr nützlich, kann aber auf die OP nicht hilfreich sein, die unter Verwendung von ein proprietäres Paket, dessen 'Imports:' Statements sie anscheinend nicht ändern können ...? –

+0

Es ist die Nebenwirkung "Importe:' von 'dplyr' er beschwert sich und hat die Kontrolle über. Ich denke, das ist in der Tat, wonach er sucht. Ich dachte das 'cannotTouchProprietaryPackage' wird als Ganzes importiert, genauso wie _parts_' dplyr'. –

+1

@DirkEddelbuettel Hast du irgendwo ein Verwendungsbeispiel dokumentiert? –

4

Verwenden Sie die Hack-R-Version von dplyr anstelle der Hadley-Version. Da ich das in den letzten 2 Minuten erstellt habe, könntest du auch einfach deine eigene Version erstellen.

require(devtools) 
install_github("hack-r/dplyr") 
require(dplyr) 

Alles, was ich tat, war Gabel es, das Projekt in RStudio über Versionskontrolle öffnen, entfernen Sie recode verpflichten, und schieben Sie es auf meine GitHub zurück.

+2

Sicher, aber Sie erstellen nur ein abgestandenes Blatt im großen Baum von R-Paketen. Das bringt keine Updates etc pp. –

+0

@DirkEddelbuettel Ich weiß, aber was ist dein Punkt? 1. Wie lange dauert das Update? 30 - 60 Sekunden? 2. Brauchen Sie wirklich Updates für 'dplyr'? Die meisten Leute, die ich kenne, frieren absichtlich die Version der Pakete ein, die sie im Produktionscode verwenden (und das Problem, mit dem OP konfrontiert ist, ist ein gutes Beispiel dafür). –

+1

Ich nehme das richtige Funktionieren des R, CRAN, BioC, ... Ökosystems * sehr * ernst, wie ich es zB für Debian und Ubuntu und deren über 20k Pakete mache. Sie sind sehr frei, eine andere Meinung zu haben, aber das wird mich (und andere) nicht davon abhalten, zu denken, dass Sie falsch liegen. Nichts ist falsch mit "Hacking Hacking Sake", aber ich bin besorgt über die richtigen Produktionssysteme, wie es Brandon für seinen Kunden ist. –

10

Die andere Alternative wäre

recode <- SILLY_PROPRIETARY_PACKAGENAME::recode 

an der Spitze des Codes (mit einem erläuternden Kommentar) zu benutzen, um eine Kopie von recode im globalen Arbeitsbereich zu erstellen (die dann die Version von dplyr Maske sollten) . Dies könnte zukünftige Verwirrung verhindern, wenn Sie Ihren Code an jemanden weitergeben, der den Bestand dplyr hat, anstatt Ihre persönlich gehackte Version zu installieren.

+3

Ich werde upvote es, aber es scheint, den Spaß und die Aufregung des Hackens zu fehlen;) –

+1

Das funktioniert eigentlich nicht für mich. Irgendwie wird 'recode.numeric' von' dplyr' immer noch vor meiner generischen 'recode' Funktion in der globalen Umgebung ausgegeben. –

+0

@BrandonBertelsen jetzt bekommen wir hacky, aber man konnte 'SILLY_PROPRIETARY_PACKAGE ::: recode.numeric' wie oben hinzufügen. Vielleicht verwenden Sie einen 'eval' Anruf mit dem, was Sie lernen von' methods' dies zu automatisieren, wenn es funktioniert – MichaelChirico

Verwandte Themen