2015-09-11 8 views
6

Gibt es einen Weg Code in einem R-Paket kann herausfinden, welche Paket oder Namespace es gehört?Code in R-Paket: Finden Sie heraus, * welches * Paket/Namespace es ist

Hintergrund: Ich finde, dass ich einen gemeinsamen Code zwischen Paketen habe, der sich nur im Paketnamen unterscheidet. Ein gemeinsames Beispiel ist tests/testthat.R:

library(testthat) 
library(ShiftedExcitation) 

test_check("ShiftedExcitation") 

Wenn der Code, an dem Paket herausfinden könnte oder Namensraum gehört, konnte ich eine Reihe von Orten zu vermeiden, in denen der Name des Pakets wird nun gegeben.


Gerade jetzt definiere ich eine versteckte Variable, die den Paketnamen enthält, sagen

.PKG <- "ShiftedExcitation"

und verwenden Sie dann etwas entlang der Linien von *

library(testthat) 
library(.PKG, character.only = TRUE) 

test_check(.PKG) 

aber ich Bin gespannt, ob es eine elegantere Lösung gibt.

* Ich funktionierte nicht so weit, wie testthat.R außerhalb des Paketnamespace ausgewertet wird. Es funktioniert jedoch zum Definieren einer unittest Funktion innerhalb des Paketcodes.

+0

Sie können '.getNameSpace (match.call() [[1]])' verwenden, die packt der Name der Funktion als Argument möglicherweise hilfreich: http://stackoverflow.com/questions/15595478/how-to-get-the-name-of-the-calling-function-inside-the-called-routine –

+0

'getNamespaceName (topenv())'? Z. B. debug (lm); lm(); getNamespaceName (topenv()) ' –

+0

@MartinMorgan:' topenv' ist fast die Antwort - nur dass der 'testthat' Namespace vor dem pacakge im' search() 'Pfad liegen kann. – cbeleites

Antwort

0

Annäherung an eine Antwort:

@ MartinMorgan des Hinweises topenv() zu verwenden ist ganz in der Nähe. Aber es stellt sich heraus, dass während Unit-Tests mit testthat, testthat ist vor der Paket-Namespace im Suchpfad ausgeführt wird.

Das ist also der aktuelle Stand:

.findmyname <- function() { 
    pkgs <- .packages() 

    if (pkgs [1] == "testthat") 
     pkgs [2] 
    else 
     pkgs [1] 
} 

Diese Funktion gibt den Namen des Pakets in Frage findet sowohl von innerhalb der Verpackung und in tests/testthat.R. (Natürlich ist .findmyname() im Paket definiert nicht in tests/testthat.R vor dem library Aufruf bekannt ...)

+1

Sieht so aus, als könnten die ersten bis dritten Zeilen wahrscheinlich durch 'pkgs <- .packages()' –

+0

@RichardScriven ersetzt werden: thanks, updated. – cbeleites

Verwandte Themen