Рассмотрите возможность добавления 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 пользователи могут затем использовать ее как переменную вместо вызова ее как функции.