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. 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 poluDepends:
Twojego pliku z opisem, albo ii) dołączdata.table
w poluImports:
Twojego pliku z opisem iimport(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.
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
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