Что означает "Ошибка в namespaceExport (ns, exports): undefined exports" означает?

При создании пакета я получил ошибку

Error in namespaceExport(ns, exports) : 
  undefined exports: FooBarBaz

Что это значит и как его исправить?

Ответ 1

Эта ошибка возникает при попытке экспортировать объект, который не существует. То есть пакет NAMESPACE содержит строку

export(FooBarBaz)

но FooBarBaz не существует в пакете.


Один случай, когда может возникнуть эта ошибка, - это когда вы пытаетесь создать общую страницу справки для нескольких функций, используя roxygen2. В приведенном ниже примере f и g являются связанными функциями, которые должны быть задокументированы на странице WidgetUtils.

#' Widget-related functions
#' 
#' Utility functions to assist working with widgets.
#' @param x An input.
#' @return A value.
#' @name WidgetUtils
#' @export
NULL

#' @rdname WidgetUtils
#' @export
f <- function(x)
{
  x + 1
}

#' @rdname WidgetUtils
#' @export
g <- function(x)
{
  x - 1
}

Ошибка в этом фрагменте кода - это включение тега @export в блоке roxygen WidgetUtils. Это говорит, что roxygen создает строку экспорта в файле NAMESPACE, но ее значение равно NULL, поэтому экспортировать нечего. Удалив строку @export, чтобы код работал правильно.

Ответ 2

Будьте осторожны, чтобы не прокомментировать строки, начинающиеся с апострофа!

Не повезло, внутри моей функции я прокомментировал строку, которая начиналась с апострофа (перед "Battlestar Galactica" в моем поддельном примере), поэтому он выглядит так:

#' @export
getMyFavoriteSciFiShows <- function() {
  myFavoriteSciFiShows <-
    c('Star Trek Next Generation',
      #'Battlestar Galactica',
      'Babylon 5')
  return(myFavoriteSciFiShows)
}

Это действительно испортило roxygen2 v 6.0.1, поскольку оно не сигнализировало никаких ошибок, и это то, что он вложил в мой файл NAMSEPACE:

export("Galactica',")
export(Battlestar)

Не только мой желаемый экспорт myFavoriteSciFiShows отсутствовал, но были добавлены два ошибочных. Эти ошибочные могут привести к экспорту undefined.

Ответ 3

У меня была очень глупая опечатка: в скелете roxygen2 я скопировал то, что должно было войти в поле #' @return, в @export.

Должно было:

#' @return new data frame
#' @export

Вместо этого у меня было:

#' @return
#' @export new data frame

Ответ 4

Я удалил функцию, а roxygen2, похоже, не удалил ее из файла NAMESPACE. Зайдите туда и удалите эту строку вручную, и это исправит ошибку