Korzystanie z danych.pakiet tabeli w moim własnym pakiecie

Próbuję wykorzystać dane.pakiet stołu w moim własnym pakiecie. MWE jest następujące:

Tworzę funkcję, test.zabawa, która po prostu tworzy małe dane.obiekt table, a następnie sumuje kolumnę" Val "grupując kolumnę" a". Kod to

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)
}

Kiedy tworzę tę funkcję w zwykłej sesji R, a następnie uruchamiam funkcję, działa ona zgodnie z oczekiwaniami.

> 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

Kiedy umieszczę tę funkcję w pakiecie, zainstaluj pakiet, załaduj pakiet, a następnie uruchom funkcję, Dostaję komunikat o błędzie.

> 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
Czy ktoś może mi wyjaśnić, dlaczego tak się dzieje i co mogę zrobić, aby to naprawić? Każda pomoc jest bardzo mile widziana.
Author: Matt Dowle, 2012-05-10

2 answers

Andrie ' s guess is right, + 1. Jest na nim FAQ (zobacz vignette("datatable-faq")), a także nowa winieta na import data.table:

FAQ 6.9: stworzyłem pakiet, który zależy od danych.stolik. Jak upewnij się, że mój pakiet TO dane.tabela-świadomy tak, że dziedziczenie z data.rama działa?

Albo i) dołącz data.table w polu Depends: Twojego pliku z opisem, albo ii) dołącz data.table w polu Imports: Twojego pliku z opisem i import(data.table) w Twojej przestrzeni nazw plik.

Dalsze informacje ... na górze [.data.table (i innych funkcji data.table) zobaczysz przełącznik w zależności od wyniku wywołania cedta(). Oznacza to wywołanie środowiskowej tabeli danych Aware. Typowanie data.table:::cedta pokazuje, jak to się robi. Polega ona na tym, że pakiet wywołujący ma Przestrzeń nazw i, że przestrzeń nazw importuje 'ING lub Depend' ING data.table. W ten sposób data.table mogą być przekazywane do danych nie-.table-aware pakiety (takie jak funkcje w base) i te pakiety mogą używać absolutnie standardowa [.data.frame składnia na data.table, błogiej nieświadomości, że data.frame is() a data.table też.

Dlatego też data.table dziedziczenie nie było kompatybilne z pakietami bez nazw i dlatego na żądanie użytkownika musieliśmy prosić autorów takich pakietów o dodanie przestrzeni nazw do ich pakietów, aby były kompatybilne. Na szczęście, teraz, gdy R dodaje domyślną przestrzeń nazw dla pakietów, których brakuje (z wersji 2.14.0), problem zniknął :

ZMIANY W WERSJI R 2.14.0
* Wszystkie pakiety muszą mieć przestrzeń nazw, a jedna jest tworzona podczas instalacji, jeśli nie jest dostarczana w źródłach.

 74
Author: Matt Dowle,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-20 14:50:33

Oto kompletny przepis:

1) Dodaj data.table do Imports w swoim pliku DESCRIPTION.

2) Dodaj {[3] } do swojego odpowiednika .Plik R (tj.Plik r, w którym znajduje się funkcja rzucająca błąd Error in [.data.frame(x, i, j) : object 'Val' not found).

3) wpisz library(devtools) i ustaw katalog roboczy tak, aby wskazywał główny katalog pakietu R.

4) Typ document(). Zapewni to, że plik NAMESPACE zawiera linię import(data.table).

5) Typ build()

6) Typ install()

Dla fajny podkład na co build() i install(), Zobacz: http://kbroman.org/pkg_primer/.

Następnie, gdy zamkniesz sesję R i następnym razem się zalogujesz, możesz od razu wskoczyć do:

1) Typ library("my_R_package")

2) Wpisz nazwę swojej funkcji, która znajduje się w .Plik r wymieniony powyżej.

3) Enjoy! Nie powinieneś już otrzymywać przerażających Error in [.data.frame(x, i, j) : object 'Val' not found

 17
Author: warship,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-29 05:59:38