У меня возникла проблема с получением data.table для работы с экспортированными функциями roxygen2.
Вот простая, поддельная функция в файле foo.R(находится в каталоге R моего пакета), который использует data.table:
#' Data.table test function
#' @export
foo <- function() {
m <- data.table(c1 = c(1,2,3))
print(is.data.table(m))
m[,sum(c1)]
}
Если я копирую и вставляю эту функцию в R, эта функция отлично работает:
> foo <- function() {
+ m <- data.table(c1 = c(1,2,3))
+ print(is.data.table(m))
+ m[,sum(c1)]
+ }
> foo()
[1] TRUE
[1] 6
Но если я просто загружаю экспортированную функцию, R думает, что data.table - это data.frame и breaks:
> rm(foo)
> load_all()
Loading test_package
> foo
function() {
m <- data.table(c1 = c(1,2,3))
print(is.data.table(m))
m[,sum(c1)]
}
<environment: namespace:test_package>
> foo()
[1] TRUE
Error in `[.data.frame`(x, i, j) : object 'c1' not found
Что?
UPDATE
Спасибо @GSee за помощь. Похоже, это проблема devtools. Ознакомьтесь с интерактивным кодом командной строки ниже.
После загрузки библиотеки test_package foo
выполняется правильно:
> foo
function ()
{
m <- data.table(c1 = c(1, 2, 3))
print(is.data.table(m))
m[, sum(c1)]
}
<environment: namespace:test_package>
> foo()
[1] TRUE
[1] 6
Запуск load_all()
breaks foo:
> load_all()
Loading test_package
> foo()
[1] TRUE
Error in `[.data.frame`(x, i, j) : object 'c1' not found
Как-то source('R/foo.R')
восстанавливает функциональность foo:
> source('R/foo.R')
> foo
function() {
m <- data.table(c1 = c(1,2,3))
print(is.data.table(m))
m[,sum(c1)]
}
> foo()
[1] TRUE
[1] 6
И последующие вызовы load_all()
не разрывают foo
снова:
> load_all()
Loading test_package
> foo
function() {
m <- data.table(c1 = c(1,2,3))
print(is.data.table(m))
m[,sum(c1)]
}
> foo()
[1] TRUE
[1] 6
Кроме того, я обновился до devtools 1.5 и попытался добавить .datatable.aware=TRUE
, но ничего не сделал.