Ich habe endlich die Antwort auf diese Frage (nach mehreren Jahren) herausgefunden. Alle Kommentare und Antworten vorgeschlagen data.table
zu Depends
oder Imports
hinzufügen, aber das ist falsch; Das Paket hängt nicht von data.table
und das könnte jedes Paket hypothetisch sein, nicht nur data.table, was bedeutet, logische Schlussfolgerung, würde der Vorschlag erfordern alle möglichen Pakete zu Depends
hinzufügen - da diese Abhängigkeit vom Benutzer zur Verfügung gestellt wird instruction
, nicht durch die Funktion, die durch das Paket zur Verfügung gestellt wird.
Stattdessen, im Grunde ist es, weil Aufruf an eval
innerhalb des Namespace des Pakets erfolgt, und dies enthält nicht die Funktionen von anderen Paketen zur Verfügung gestellt. Ich löste schließlich die durch die globale Umwelt im eval
Aufruf spezifiziert:
myFunc = function(instruction) {
eval(parse(text=instruction), envir=globalenv())
}
Warum das funktioniert
Dies bewirkt, dass die eval
Funktion in der Umgebung durchgeführt werden, dass die erforderlichen Pakete in der Suche enthalten wird Pfad.
Im Fall data.table
ist es wegen der Komplexität der Funktionsüberlastung besonders schwierig zu debuggen. In diesem Fall ist der Täter nicht die :=
Funktion, sondern die Funktion. Der :=
Fehler ist ein Ablenkungsmanöver.Zum Zeitpunkt des Schreibens, die :=
Funktion in data.table
ist wie folgt definiert:
https://github.com/Rdatatable/data.table/blob/348c0c7fdb4987aa6da99fc989431d8837877ce4/R/data.table.R#L2561
":=" <- function(...) stop('Check that is.data.table(DT) == TRUE. Otherwise, := and `:=`(...) are defined for use in j, once only and in particular ways. See help(":=").')
Das ist es. Was das heißt: Jeder Aufruf an :=
als Funktion wird mit einer Fehlermeldung gestoppt, weil die Autoren nicht beabsichtigen, :=
zu verwenden. Stattdessen ist :=
wirklich nur ein Schlüsselwort, das von der [
-Funktion in data.table
interpretiert wird.
Aber was hier geschieht: Wenn die [
Funktion nicht korrekt an die von data.table
angegebenen Version abgebildet wird, und stattdessen auf die [
Basis zugeordnet ist, dann haben wir ein Problem - da es nicht :=
verarbeiten kann und so Es wird als eine Funktion behandelt und löst die Fehlermeldung aus. Die Täterfunktion ist also [.data.table
- der überladene Klammeroperator.
Was geschieht ist in meinem neuen Paket (das hält myFuncInPackage
), wenn es um den Code zu bewerten geht, es löst die [
Funktion auf die Funktion Basis [
statt auf data.table
‚s [
Funktion. Es versucht :=
als eine Funktion auszuwerten, die von der [
nicht konsumiert wird, da es nicht die richtige [
ist, also :=
wird als Funktion statt als data.table
's übergeben, da sich data.table
nicht im Namespace befindet (oder niedriger in der search()
Hierarchie. in dieser Einstellung wird :=
nicht verstanden und so wird es wird als Funktion ausgewertet, so dass die Auslösung der Fehlermeldung im data.table
Code oben.
Wenn Sie die eval angeben, um im globalen passieren Umgebung wird die [
-Funktion korrekt in [.data.table
aufgelöst und die :=
wird richtig interpretiert.
Im Übrigen können Sie auch diese verwenden, wenn Sie nicht eine Zeichenfolge durchzulassen, aber einen Codeblock (besser) zu eval()
in einem Paket:
eval(substitute(instruction), envir=globalenv())
Hier verhindert substitute
die instruction
entfernt, Wird (inkorrekt) im Paket-Namespace in der argent-eval-Phase analysiert, so dass es intakt zurück in den globlenv-Code gelangt, wo es mit den erforderlichen Funktionen korrekt ausgewertet werden kann.
Haben Sie den Ratschlag in [FAQ 6.9] (http://cran.r-project.org/web/packages/data.table/vignettes/datatable-faq.pdf) befolgt? Außerdem wird von 'eval (parse())' abgeraten. – Roland
@Roland data.table zu Depends hinzufügen löst es ... aber führt zu einem Problem: mein Paket hängt nicht wirklich von data.table ab; in der Tat, es ist völlig unabhängig. Wie in diesem Beispiel, hat es nur eine Funktion, 'myFunc' - keine data.table nichts. Aber es kann nicht mit data.table verwendet werden, ohne es zu Depends hinzuzufügen ... – nsheff
@Roland, ich weiß, 'eval (parse())' wird abgeraten, und dies ist ein sinnloses Beispiel, aber die Frage steht immer noch. ..in einigen Fällen kann ich es nicht umgehen. – nsheff