Die Nachricht bedeutet, dass beide Pakete Funktionen mit demselben Namen haben. In diesem speziellen Fall enthalten die Pakete testthat
und assertive
fünf Funktionen mit demselben Namen.
Wenn zwei Funktionen den gleichen Namen haben, welche wird aufgerufen?
R durchsucht den search
Pfad nach Funktionen und verwendet die erste gefundene.
search()
In diesem Fall wird es, da assertive
es danach geladen wurde testthat
, früher im Suchpfad angezeigt, sodass die Funktionen in diesem Paket verwendet werden.
is_true
<bytecode: 0x0000000004fc9f10>
<environment: namespace:assertive.base>
Die Funktionen in testthat
sind nicht auf die übliche Weise zugänglich. das heißt, sie wurden maskiert .
Was ist, wenn ich eine der maskierten Funktionen verwenden möchte?
Sie können einen Paketnamen explizit angeben, wenn Sie eine Funktion mit dem Doppelpunkt-Operator aufrufen ::
. Zum Beispiel:
testthat::is_true
Wie unterdrücke ich die Nachricht?
Wenn Sie über den Funktionsnamenkonflikt Bescheid wissen und ihn nicht mehr sehen möchten, können Sie die Nachricht unterdrücken, indem Sie warn.conflicts = FALSE
an übergeben library
.
library(testthat)
library(assertive, warn.conflicts = FALSE)
Alternativ können Sie die Nachricht unterdrücken mit suppressPackageStartupMessages
:
library(testthat)
suppressPackageStartupMessages(library(assertive))
Einfluss der Startprozeduren von R auf die Funktionsmaskierung
Wenn Sie einige der Startkonfigurationsoptionen von R geändert haben (siehe ?Startup
), tritt möglicherweise ein anderes Funktionsmaskierungsverhalten auf als erwartet. Die genaue Reihenfolge, in der die Dinge wie geplant geschehen, ?Startup
sollte die meisten Rätsel lösen.
In der Dokumentation heißt es beispielsweise:
Beachten Sie, dass beim Quellen der Site- und Benutzerprofildateien nur das Basispaket geladen wird. Daher müssen Objekte in anderen Paketen beispielsweise von utils :: dump.frames oder nach dem expliziten Laden des betreffenden Pakets referenziert werden.
Dies bedeutet, dass beim Laden .Rprofile
von Paketen von Drittanbietern über Dateien wie diese möglicherweise Funktionen von Paketen angezeigt werden , die von denen in Standardpaketen wie Statistiken maskiert sind , und nicht umgekehrt, wenn Sie das Paket von Drittanbietern nach Abschluss des Startvorgangs von R geladen haben.
Wie liste ich alle maskierten Funktionen auf?
Holen Sie sich zunächst einen Zeichenvektor aller Umgebungen auf dem Suchpfad. Der Einfachheit halber benennen wir jedes Element dieses Vektors mit einem eigenen Wert.
library(dplyr)
envs <- search() %>% setNames(., .)
Rufen Sie für jede Umgebung die exportierten Funktionen (und andere Variablen) ab.
fns <- lapply(envs, ls)
Verwandeln Sie dies in einen Datenrahmen für die einfache Verwendung mit dplyr.
fns_by_env <- data_frame(
env = rep.int(names(fns), lengths(fns)),
fn = unlist(fns)
)
Suchen Sie nach Fällen, in denen das Objekt mehrmals angezeigt wird.
fns_by_env %>%
group_by(fn) %>%
tally() %>%
filter(n > 1) %>%
inner_join(fns_by_env)
Um dies zu testen, versuchen , einige Pakete mit bekannten Konflikten Laden (zB Hmisc
, AnnotationDbi
).
Wie verhindere ich Namenskonfliktfehler?
Das conflicted
Paket gibt einen Fehler mit einer hilfreichen Fehlermeldung aus, wenn Sie versuchen, eine Variable mit einem mehrdeutigen Namen zu verwenden.
library(conflicted)
library(Hmisc)
units
Hmisc::units
? Ich muss es an den Anfang des Suchpfads setzen, um es so zu verwenden :units(df$age)<-'y'
. Gibt es dafür eine Methode?base::units()
, wie Sie es mit jedem anderen Paket tun würden.Ich habe das gleiche Problem. Ich vermeide es mit
remove.packages("Package making this confusion")
und es funktioniert. In meinem Fall brauche ich das zweite Paket nicht, das ist also keine sehr gute Idee.quelle