RDCOMClient предлагается в пакете

У меня был R-пакет с использованием RDCOMClient через файл DESCRIPTION:

Предлагает: RDCOMClient

и следующий (идеально рабочий) код:

GetNewWrd <- function() {

  stopifnot(require(RDCOMClient))

  # Starts the Word application with wrd as handle
  wrd <- RDCOMClient::COMCreate("Word.Application", existing=FALSE)
  newdoc <- wrd[["Documents"]]$Add("",FALSE, 0)
  wrd[["Visible"]] <- TRUE 

  invisible(wrd)
}

В настоящее время это считается плохой практикой, и «Написание расширений R, 1.1.3.1 Предлагаемые пакеты» говорит нам сформулировать:

if (requireNamespace("rgl", quietly = TRUE)) {
   rgl::plot3d(...)
} else {
   ## do something else not involving rgl.
}

или: .. Если намерение состоит в том, чтобы выдать ошибку, если предлагаемый пакет недоступен, просто используйте, например, rgl::plot3d.

Перекодирование этого (насколько я понимаю) означало бы просто удалить оператор требования:

GetNewWrd <- function() {

  # Starts the Word application with wrd as handle
  wrd <- RDCOMClient::COMCreate("Word.Application", existing=FALSE)
  newdoc <- wrd[["Documents"]]$Add("",FALSE, 0)
  wrd[["Visible"]] <- TRUE 

  invisible(wrd)
}

Это приводит к следующей ошибке времени выполнения:

Error in RDCOMClient::COMCreate("Word.Application", existing = FALSE) :
  could not find function "createCOMReference"

createCOMReference — это функция в RDCOMClient, которую, по-видимому, нельзя найти без явного оператора require.

Как, ради Бога, я должен интегрировать RDCOMClient в свой пакет, соответствующий политикам CRAN???


person Andri Signorell    schedule 12.01.2015    source источник
comment
createCOMReference нельзя экспортировать из RDCOMClient. Вы смотрели на другие принятые пакеты, такие как DescTools? Кроме того, теперь, когда я снова прочитал раздел 1.1.3.1, я не думаю, что он говорит о том, что вы не можете использовать require, а скорее о том, что в тех случаях, когда это необязательно, маршрут requireNamespace может создать меньше проблем. Опасается, что функции могут быть перезаписаны. Это маловероятно для функций RDCOMClient.   -  person IRTFM    schedule 13.01.2015
comment
Я автор DescTools и хотел загрузить обновление. Но профессор Рипли отказался с комментарием: вы не соблюдаете политику в отношении предложений или улучшений не в основных репозиториях: RDCOMClient * проверка зависимостей в коде R ... ПРИМЕЧАНИЕ «библиотека» или «требовать» вызов «RDCOMClient» в пакете код. Вместо этого используйте :: или requireNamespace(). См. раздел «Предлагаемые пакеты» в руководстве «Написание расширений R».   -  person Andri Signorell    schedule 13.01.2015
comment
Цвет меня озадачил. Я бы подумал, что OmegaHat будет считаться основным репозиторием. Есть ли смысл связаться с Дунканом Темпл Лэнгом?   -  person IRTFM    schedule 13.01.2015
comment
:-) Это еще более странно, поскольку самую последнюю версию можно найти на его собственном веб-сайте: stats.ox.ac.uk/pub/RWin/bin/windows/contrib/3.0. Возможно, стоит связаться с Дунканом Темпл Лэнгом напрямую...   -  person Andri Signorell    schedule 13.01.2015


Ответы (1)


Очень старый вопрос, но я наткнулся на ту же проблему. Я использую следующий обходной путь, который не выдает предупреждения в R CMD check, но кажется мне ужасным взломом:

if (requireNamespace("RDCOMClient", quietly = TRUE)) {
   if (!"RDCOMClient" %in% .packages()) {
      attachNamespace("RDCOMClient")
   }
# ...
}
person thothal    schedule 20.01.2021