Данные пакета R недоступны при импорте в другой пакет - PullRequest
0 голосов
/ 30 ноября 2018

У меня есть один пакет "testing" с объектом данных "test_data", сохраненным в папке данных под именем файла "test_data.RData".

testing содержит одну функцию hello (), которая использует этот объект данных

#' hello
#'
#' @return Prints hello "your_name"
#' @export
#'
#' @examples
#' hello()
hello <- function(your_name = "") {

    print(paste("test_data has", nrow(test_data), "rows"))
    print(sprintf("Hello %s!", your_name))
}

следующий код работает нормально:

require(testing)
testing::hello()
[1] "test_data has 32 rows"
[1] "Hello !"

, но это не удается:

testing::hello()
Error in nrow(test_data) : object 'test_data' not found

На самом деле я не использую его напрямую, но в другом пакете тестирования, который импортирует этотfunction:

#' Title
#'
#' @export
#' @importFrom testing hello
hello2 <- function(){

    hello()
}

У меня есть тестирование в разделе Imports DESCRIPTION, и это не удается.

require(testingtop)
testingtop::hello2()
Error in nrow(test_data) : object 'test_data' not found

Если я помещаю его в Зависит, это работает, если я загружаю пакет с библиотекой ()в противном случае все равно происходит сбой:

> library(testingtop)
Loading required package: testing
> testingtop::hello2()
[1] "test_data has 32 rows"
[1] "Hello !"

Restarting R session...

> testingtop::hello2()
Error in nrow(test_data) : object 'test_data' not found

, если бы это была функция вместо объекта данных. Импортирование было бы хорошо, почему это отличается от объекта данных, и мне нужно загрузить импортированный пакет?Я что-то пропустил?И связано ли это с LazyData и LazyLoad?

Возможно, дубликат этот вопрос

1 Ответ

0 голосов
/ 30 ноября 2018

ТАК Я думаю, что я нашел решение из документа функции данных ?data

Использование данных внутри функции без аргумента envir имеет почти всегда нежелательный побочный эффект:помещение объекта в рабочую область пользователя (и, на самом деле, замена любого объекта с таким именем, который уже существует).Почти всегда было бы лучше поместить объект в текущую среду оценки по данным (..., envir = environment ()).Однако обычно предпочтительны две альтернативы, обе описаны в руководстве «Написание R-расширений».Для наборов данных, установите пакет для использования отложенной загрузки данных.Для объектов, которые являются системными данными, например таблицы поиска, используемые в вычислениях внутри функции, используйте файл 'R / sysdata.rda' в источниках пакета или создайте объекты с помощью кода R во время установки пакета.Иногда важное различие заключается в том, что второй подход помещает объекты в пространство имен, а первый - нет. Так что, если важно, чтобы функция воспринимала mytable как объект из пакета, это системные данные, и следует использовать второй подход.

Помещение данных во внутреннийфайл данных заставил мою функцию hello2 () увидеть его

> testingtop::hello2()
[1] "test_data has 32 rows"
[1] "Hello !"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...