【发布时间】:2019-02-07 19:03:18
【问题描述】:
我有一个包,它从互联网上抓取数据并根据函数调用显示其内容。但最近我从 CRAN 收到一条消息,当安装二进制构建时数据变得陈旧(因为该功能在 utils.R 中提到并且它在构建时已下载)。
在过去的几天里,我尝试了以下但没有成功:
- 使用
<<-的全局变量,但它会生成一个 CRAN 注释,我还查看了一些建议不要使用该方法的答案 注:no visible binding for global variable - 创建一个新环境,然后在其中添加这个下载的对象,但由于我无法在其他功能中访问该对象,因此它从未成功。参考:Where to create package environment variables?
这是当前的包文件: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 上,我希望我已经提供了足够的数据来保存这个正在下载的问题。
谢谢!
【问题讨论】:
-
在你的包中创建一个环境。具有下载数据并将其写入该环境的功能。然后在 .onLoad 中调用该函数。
-
@Thomas 感谢您的评论。它帮助我使用 hrbrmstr 的逻辑来解决问题。
-
请不要这样做。加载包的能力不应依赖于互联网连接和特定站点的启动。它应该只在用户请求时才更新。我会推荐一个
update_mypkg_data()函数,其中可能包含一个包启动消息,建议用户运行它。 -
@Hugh 但是包本身只有在连接到互联网时才能运行,否则在早期的情况下,用户获得的数据不是正确的/新的