Документация внутреннего объекта не выполняется, если она не указана в функции или явно создана в строке - PullRequest
2 голосов
/ 31 марта 2020

У кого-нибудь есть объяснение следующего поведения?

У меня есть файл .R для документации. Я хочу использовать внутренний объект для создания нового объекта (импортированного или экспортированного, это не имеет значения, оба приводят к одному и тому же сбою)

Для моего пакета testpak я создал внутренний объект с

data_int <- data.frame(a = 1)
usethis::use_data(data_int, internal = TRUE, overwrite = TRUE)

Для сборки пакета я использую файл .R со следующим кодом:

Не работает

#' some_name
#' @description something
#' @return list for each test type
test <- testpak:::data_int

#> Error in get(name, envir = asNamespace(pkg), inherits = FALSE) : object 'data_int' not found
#> ERROR: lazy loading failed for package ‘testpak’

I вроде бы понять, что каким-то образом возникают проблемы с поиском объекта в еще не определенном пространстве имен.

Но теперь это забавно. Когда я получаю доступ к одному и тому же объекту внутри функции, сборка пакета работает .

#' some_name
#' @description something
#' @return list for each test type
test <- function() testpak:::data_int
#> no error

Еще один способ заставить сборку пакета работать - добавить usethis::use_data(...) в код.
Достаточно забавно, но на самом деле не перезаписывает ранее записанный внутренний объект! (несмотря на использование overwrite = TRUE)

#' some_name
#' @description something
#' @return list for each test type
data_int <- data.frame(a = 1)
usethis::use_data(data_int, internal = TRUE, overwrite = TRUE) # does not actually overwrite the previously written internal object

test <- testpak:::data_int
#> no error

sessionInfo()
#R version 3.6.3 (2020-02-29)
#Platform: x86_64-apple-darwin15.6.0 (64-bit)
#Running under: macOS Mojave 10.14.6
#roxygen2_7.1.0

1 Ответ

2 голосов
/ 31 марта 2020

Если вы создаете функцию в источнике вашего пакета, она не выполняется. Вы можете создать такую ​​функцию, как

alwaysError <- function(...) stop("This is an error!")

, и она не будет вызывать ошибку, пока вы ее не запустите.

Ваш код

test <- testpak:::data_int

создает test возражать, выполняя код справа. Таким образом, он генерирует ошибку, поскольку testpak еще не существует как пакет, поэтому вы не можете извлечь из него объект data_int.

Функция usethis::use_data должна записать некоторый источник код в вашу посылку. Но если вы выполните его при попытке установить пакет, он, вероятно, запишет этот код в какое-то неуместное место. Очевидно, где бы он ни был написан, он не читается кодом установки пакета.

...