Ich versuche, das Paket data.table in meinem eigenen Paket zu verwenden. MWE ist wie folgt:
Ich erstelle eine Funktion, test.fun, die einfach ein kleines data.table-Objekt erstellt und dann die Spaltengruppierung "Val" durch die Spalte "A" summiert. Der Code ist
test.fun<-function ()
{
library(data.table)
testdata<-data.table(A=rep(seq(1,5), 5), Val=rnorm(25))
setkey(testdata, A)
res<-testdata[,{list(Ct=length(Val),Total=sum(Val),Avg=mean(Val))},"A"]
return(res)
}
Wenn ich diese Funktion in einer regulären R-Sitzung erstelle und dann die Funktion ausführe, funktioniert sie wie erwartet.
> res<-test.fun()
data.table 1.8.0 For help type: help("data.table")
> res
A Ct Total Avg
[1,] 1 5 -0.5326444 -0.1065289
[2,] 2 5 -4.0832062 -0.8166412
[3,] 3 5 0.9458251 0.1891650
[4,] 4 5 2.0474791 0.4094958
[5,] 5 5 2.3609443 0.4721889
Wenn ich diese Funktion in ein Paket einfüge, das Paket installiere, das Paket lade und dann die Funktion ausführe, wird eine Fehlermeldung angezeigt.
> library(testpackage)
> res<-test.fun()
data.table 1.8.0 For help type: help("data.table")
Error in `[.data.frame`(x, i, j) : object 'Val' not found
Kann mir jemand erklären, warum dies geschieht und was ich tun kann, um es zu beheben. Jede Hilfe wird sehr geschätzt.
r
data.table
Ruser
quelle
quelle
library(data.table)
aus Ihrer Funktion entfernen unddepends:data.table
in Ihrem Namespace und in DESCRIPTION deklarieren .Antworten:
Andries Vermutung ist richtig, +1. Es gibt eine FAQ (siehe
vignette("datatable-faq")
) sowie eine neue Vignette zum Importierendata.table
:Weiterer Hintergrund ... oben in
[.data.table
(und anderendata.table
Funktionen) sehen Sie einen Schalter, der vom Ergebnis eines Anrufs an abhängtcedta()
. Dies steht für Calling Environment Data Table Aware. Das Tippendata.table:::cedta
zeigt, wie es gemacht wird. Es setzt voraus, dass das aufrufende Paket einen Namespace hat und dass dieser Namespace importiert oder davon abhängtdata.table
. Auf diese Weisedata.table
kann an nicht data.table-fähige Pakete (wie z. B. Funktionen inbase
) übergeben werden, und diese Pakete können die absolut standardmäßige[.data.frame
Syntax auf dem verwendendata.table
, ohne dass diesdata.frame
is()
a bewusstdata.table
ist.Dies ist auch der Grund, warum die
data.table
Vererbung früher nicht mit namenlosen Paketen kompatibel war und warum wir auf Benutzeranforderung die Autoren solcher Pakete bitten mussten, ihrem Paket einen Namespace hinzuzufügen, um kompatibel zu sein. Glücklicherweise ist dieses Problem behoben, nachdem R einen Standard-Namespace für fehlende Pakete (ab Version 2.14.0) hinzugefügt hat:quelle
data.table
einem Benutzer in einer interaktiven Sitzung eine zurückgibt , muss er dann diedata.table
Semantik verwenden, oder gibt es eine Möglichkeit, die bekanntedata.frame
Syntax zu unterstützen?import(data.table)
in NAMESPACE hatten?@import data.table
im Code hinzugefügt wurde, damit Roxygen esimport(data.table)
im NAMESPACE hinzufügt .Hier ist das komplette Rezept:
1) Fügen Sie
data.table
zuImports
IhrerDESCRIPTION
Datei.2) Fügen Sie
@import data.table
Ihrer jeweiligen .R-Datei hinzu (dh die .R-Datei, in der sich Ihre Funktion befindet, die den Fehler auslöstError in [.data.frame(x, i, j) : object 'Val' not found
).3) Geben Sie
library(devtools)
Ihr Arbeitsverzeichnis ein und stellen Sie es so ein, dass es auf das Hauptverzeichnis Ihres R-Pakets zeigt.4) Typ
document()
. Dadurch wird sichergestellt, dass IhreNAMESPACE
Datei eineimport(data.table)
Zeile enthält.5) Typ
build()
6) Typ
install()
Eine gute Einführung in was
build()
undinstall()
was gibt es unter: http://kbroman.org/pkg_primer/ .Sobald Sie Ihre R-Sitzung geschlossen und sich das nächste Mal angemeldet haben, können Sie sofort mit folgenden Funktionen einspringen:
1) Typ
library("my_R_package")
2) Geben Sie den Namen Ihrer Funktion ein, die in der oben genannten .R-Datei enthalten ist.
3) Viel Spaß! Sie sollten die gefürchteten nicht mehr erhalten
Error in [.data.frame(x, i, j) : object 'Val' not found
quelle
function not found
. Ich konnte nichts Ähnliches finden, also habe ich eine Frage erstellt stackoverflow.com/questions/56720520/…