代码之家  ›  专栏  ›  技术社区  ›  amrrs

每次加载包时从internet下载新数据

  •  3
  • amrrs  · 技术社区  · 6 年前

    utils.R 它在构建过程中下载了)。

    • 全局变量使用 <<- 注: 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上,我希望我已经提供了足够的数据来保存正在下载的这个问题。

    2 回复  |  直到 6 年前
        1
  •  3
  •   hrbrmstr    6 年前

    memoise 作为一个依赖项,这样您就可以使用最小的依赖链免费获得会话缓存,然后使用一个包环境和一个活动绑定(只是为了好玩)。

    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)
    

    现在,创建一个活动绑定,让我们像访问变量一样访问表(即w/o () ). 这比必要的更“有趣”(同样,在 ):

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

    现在,获取如下值(注意,我们得到的是“加载”消息,因为它“初始化”缓存:

    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会话中,它将刷新表。这样,就可以在不滥用网站的情况下获得新的数据。您可以使用文件排序,而不是排序名称黑客以及。

    请注意,您也可以导出活动绑定,然后用户可以像使用变量一样使用它,而不是像调用函数一样调用它。

        2
  •  2
  •   amrrs    6 年前

    事实上,我采取了与上述方法稍有不同的方法 answer comment 原因是我不想补充 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() 它自己。