Загрузка новых данных из интернета при каждой загрузке пакета - PullRequest
0 голосов
/ 02 сентября 2018

У меня есть пакет, который очищает данные из Интернета и отображает их содержимое на основе вызова функции. Но недавно я получил сообщение от CRAN о том, что данные становятся устаревшими при установке Binary build (так как функция была упомянута в utils.R, и она была загружена во время сборки).

Последние несколько дней я пробовал следующее, но безуспешно:

  • Глобальная переменная с использованием <<-, но она генерирует заметку CRAN, и я также просмотрел несколько ответов, которые советовали против подхода Примечание: no visible binding for global variable
  • Создайте новое окружение, а затем добавьте в него этот загруженный объект, но это не сработало, поскольку я не мог получить доступ к объекту в других функциях. Ссылка: Где создавать переменные среды пакета?

Это текущие файлы пакета: https://github.com/amrrs/tiobeindexr/tree/master/R

Пробный раствор:

zzz.r файл:

.onLoad <- function (libname, pkgname)
{

  assign("newEnv", new.env(hash = TRUE, parent = parent.frame()))

  newEnv$.all_tablesx789  <- rvest::html_table(xml2::read_html('https://www.tiobe.com/tiobe-index/'))


}

одна из функций в коде ядра.

hall_of_fame <- function() {

  #check_data()

  #.GlobalEnv$.all_tablesx789 <- check_data()

  newEnv$.all_tablesx789[[4]]

}

Пакет работает нормально, но объект не найден. Ошибка ниже:

Error in hall_of_fame() : object 'newEnv' not found

У меня есть всего пара дней, чтобы сохранить свой пакет в CRAN, и я надеюсь, что предоставил достаточно данных для сохранения загруженного вопроса.

Спасибо!

Ответы [ 2 ]

0 голосов
/ 03 сентября 2018

На самом деле, я немного отличался от приведенного выше ответа . Это связано с комментарием Томаса , и причина в том, что я не хотел добавлять memoise в качестве зависимости и попробовал альтернативу.

Создание нового пакета в aaa.R:

.pkgenv <- new.env(parent=emptyenv())

Загрузка данных в таблицы в среде с использованием .onAttach() в zzz.R

.onAttach <- function(libname, pkgname) {

  packageStartupMessage("Downloading TIOBE Index Data using your Internet...")

  tryCatch({
    .pkgenv$.get_tiboe_tables <- rvest::html_table(xml2::read_html("https://www.tiobe.com/tiobe-index/"))
  },
  error = function(e){
    packageStartupMessage("Downloading TIOBE Index data failed!")
    packageStartupMessage("Error Message:")
    packageStartupMessage(e)
    return(NA)
  })

}

Мои предыдущие ошибки, похоже, что я пытался создать новую среду внутри .onLoad().

0 голосов
/ 02 сентября 2018

Рассмотрите возможность добавления memoise в качестве зависимости, чтобы вы могли получить внутрисессионное кэширование бесплатно с минимальной цепочкой зависимостей, а затем с использованием среды пакета и (просто для удовольствия) активного связывания.

Создать новую v env (вы можете вставить это, скажем, aaa.R):

.pkgenv <- new.env(parent=emptyenv())

Теперь (скажем, в zzz.R) настройте одну функцию, которая выполняет захват таблицы:

.get_tiboe_tables <- function(url) {
  message("Delete this since it's just to show caching works") # delete this
  content <- xml2::read_html(url)
  rvest::html_table(content)
}

И «запомни» это (опять же, в zzz.R):

get_tiboe_tables <- memoise::memoise(.get_tiboe_tables)

Теперь создайте активную привязку, которая позволит нам обращаться к таблицам как к переменной (то есть без ()). Это более "весело", чем необходимо (опять же, в zzz.R):

makeActiveBinding(
  sym = "all_tables",
  fun = function() get_tiboe_tables('https://www.tiobe.com/tiobe-index/'),
  env = .pkgenv
)

Теперь получите значение, подобное этому (обратите внимание, мы получаем сообщение «loading», так как оно «заполняет» кэш:

str(.pkgenv$all_tables, 1)
## Delete this since it's just to show caching works ** the loading msg
## List of 4
##  $ :'data.frame':    20 obs. of  6 variables:
##  $ :'data.frame':    30 obs. of  3 variables:
##  $ :'data.frame':    15 obs. of  8 variables:
##  $ :'data.frame':    15 obs. of  2 variables:

При последующих вызовах нет сообщения о загрузке, так как он получает кэшированное значение:

str(.pkgenv$all_tables, 1)
## List of 4
##  $ :'data.frame':    20 obs. of  6 variables:
##  $ :'data.frame':    30 obs. of  3 variables:
##  $ :'data.frame':    15 obs. of  8 variables:
##  $ :'data.frame':    15 obs. of  2 variables:

В следующем сеансе R он обновит таблицы. Таким образом, есть свежие данные без злоупотребления сайтом. Вы также можете использовать сопоставление файлов вместо взлома отсортированных имен.

Обратите внимание, что вы также можете экспортировать активную привязку, и ваши then пользователи могут затем использовать ее как переменную вместо вызова ее как функции.

...