R: 2 gleichnamige Funktionen in 2 verschiedenen Paketen

73

Ich muss in R-Pakete laden: tseries und chron

Beide haben eine Funktion namens is.weekend

Ich habe immer in meiner Umgebung die Funktion aus dem zweiten Paket, das ich geladen habe.

Wie kann ich immer von chron auf die Funktion zugreifen?

RockScience
quelle

Antworten:

100

Sie haben wahrscheinlich bereits bemerkt, dass die Reihenfolge des Ladens der Pakete einen Unterschied macht, dh das zuletzt geladene Paket maskiert die Funktionen in zuvor geladenen Paketen.

Um das Paket anzugeben, das Sie verwenden möchten, lautet die Syntax wie folgt:

chron::is.weekend()
tseries::is.weekend()

Mit anderen Worten, verwenden Sie packagename::functionname()

Wenn Sie wissen, dass Sie die Funktion immer in chron verwenden möchten, können Sie Ihre eigene Funktion wie folgt definieren:

is.weekend <- chron::is.weekend    #EDIT
Andrie
quelle
4
is.weekend<-chron::is.weekendreicht.
mbq
4
Hier nicht relevant, also nur zum späteren Nachschlagen in diesem Thread: Wenn die Funktion nicht exportiert wird (dh Sie möchten eine bestimmte S3-Methode und die Methode wird nicht exportiert, aber die generische), ist der :::Operator erforderlich.
Gavin Simpson
3
@ Gavin Das ist richtig, aber ich bin immer sehr vorsichtig, wenn ich mich auf eine Funktion beziehe, die nicht exportiert wird. Vermutlich hat der Paketautor es aus einem bestimmten Grund nicht exportiert und konnte die Funktion ohne Vorwarnung ändern. Um Code zu schützen, der von dieser Art von Funktion abhängig ist, ist es möglicherweise besser, entweder den Paketautor zum Exportieren dieser Funktion zu überreden oder die Erlaubnis zur Wiederverwendung in Ihrem eigenen Code zu erhalten.
Andrie
1
Ich stimme dem Produktionscode in einem Paket voll und ganz zu. Für den persönlichen Gebrauch sehe ich die Probleme nicht, solange man die genaue Version der Paketquellen archiviert und Details darüber aufzeichnet, welche Versionen von Paketen im Datenanalysecode verwendet werden. Dies gilt natürlich für jede Verwendung von Paketcode, da Sie die Launen der Paketentwickler sind, um Änderungen vorzunehmen, und der gesamte Code enthält wahrscheinlich einige Fehler ... Das Hauptproblem ist meiner Meinung nach die Reproduzierbarkeit, der Rest müssen wir akzeptieren und leben mit, aber mindestens einer kann den Code sehen und überprüfen, ob er mit R- und (den meisten) R-Paketen funktioniert.
Gavin Simpson
3
@LauriK Verwenden Sie base::`%in%`oder`%in%` <- base::`%in%`
Andrie
5
library(chron)
is.weekend.chron <- is.weekend
library(tseries)

dann können Sie is.weekend für die tseries-Version oder is.weekend.chron für die chron-Version aufrufen

jberg
quelle
3

Sie sollten sich an das conflictedPaket von Hadly wenden.

library(conflicted)
library(dplyr)
filter(mtcars, am & cyl == 8)

Dann wird das in Konflikt stehende Paket einen Fehler auslösen und Sie zwingen, klar zu bestimmen, welche Funktion Sie bevorzugen:

Fehler: Filter in 2 Paketen gefunden. Sie müssen angeben, welche Sie mit :: * dplyr :: filter * stats :: filter möchten

Verwenden Sie Folgendes, um Konflikte für Ihre gesamte Sitzung zu lösen <-:

filter <- dplyr::filter
filter(mtcars, am & cyl == 8)
    mpg cyl disp  hp drat   wt qsec vs am gear carb
1 15.8   8  351 264 4.22 3.17 14.5  0  1    5    4
2 15.0   8  301 335 3.54 3.57 14.6  0  1    5    8

Sie können sich auch der conflict_prefer()Funktion zuwenden, mit der der Gewinner ermittelt werden kann, wenn ein Konflikt auftritt. Das Codebeispiel wurde von Hadly ausgeliehen. Bitte beziehen Sie sich auf die Paket-Website. https://www.tidyverse.org/blog/2018/06/conflicted/

Lovelyzlf
quelle
0

Ich hatte 2 Pakete, die den gleichen Funktionsnamen hatten ts () Die 2 Pakete, die den gleichen Namen hatten, waren:

  1. Prognose
  2. Listenpunkt

Ich überprüfte, was los war, indem ich tippte

?ts


Help on topic 'ts' was found in the following packages:

Time-Series Objects
(in package stats in library C:/Program Files/R/R-3.6.2/library)
Format time stamps
(in package bReeze in library C:/Users/mycomputer/Documents/R/win-library/3.6)

Lösung: Um dann die Funktion ts zu verwenden, die mit der Paketvorhersage geliefert wird, die ich verwendet habe: weil die Hilfe mir zeigte, dass forcast Statistiken aufruft

Zeitreihenobjekte (in Paketstatistiken

stats::ts

weil aus der Hilfe hervorgeht, dass Prognosen ein Paket namens stats verwenden;)

forecast::ts

Time-Series Objects
(in package stats

gab mir einen Fehler, weil das Prognosepaket ein Unterpaket verwendete;

Die endgültige Verwendung sieht also folgendermaßen aus:

library(bReeze)
library(forecast)

# Subset data
my_time_series <- stats::ts(c(df_sub$y), start=2018, frequency = 12)

# Plot
theme_set(theme_classic())
ggseasonplot(my_time_series) + labs(title="My graph title")
Sylvain
quelle