楚新元 | All in R

Welcome to R Square

从 GitHub 上下载文件的一点经验

楚新元 / 2023-10-13


曾几何时,当我看到统计之都上的一篇文章《用 R 语言的 blogdown+hugo+netlify+github 建博客》,我也非常想利用 blogdown 和 hugo 搭建一个属于自己的博客,没有广告,分享一些关于 R 语言的编程知识,同时也方便自己某一天用到。想法虽好,可是 blogdown 默认的主题托管在 GitHub 上,hugo 也在 GitHub 上,这两个问题对于当时的我简直是要命的,因为我无法访问 GitHub,我差点因此放弃搭建博客。可是后来这些问题还是逐个被我克服了,感谢网友的分享的经验。

下载 GitHub 仓库文件顺利建站

blogdown 默认的主题以及 hugo 官网上的博客主题都托管在 GitHub 上,当时我是导入到 Gitee 然后再下载。但是 hugo 软件就没办法这么下载了,因为你从 GitHub 上导入到 Gitee 上的是源代码,这个时候我找到了一个神奇的网站 https://hub.fastgit.org1,这个网站和 GitHub 基本上做到了实时同步,可以通过这个网站找到 hugo 软件的下载地址,然后通过 https://d.serctl.com/ 网站下载下来。基本的原材料备齐了,剩下的步骤对我来说相对简单多了,因为有现成的教程。所以我的博客得来不易,一直都是我割舍不下的孩子一般。

如果你没时间听我讲故事,那么你现只需要记住目前能用的两个有用的网站:一是 Gitee;二是 https://d.serctl.com/

访问 GitHub 镜像网站隔靴挠痒

在我没有访问 GitHub 的时候全靠别人博客上的二手资料,对的错的我不知道,只能一个个试错,直到可以访问 GitHub 的镜像网站(https://hub.fastgit.org),很多问题其实在项目的 issues 里可能已经解决了。另外,还可以找到了很多与 R 相关的项目,以及比较牛的开发者。

为了方便自己,也为了方便其他人,我套壳 remotes 包开发了 ipkg 包,实现了安装托管在 GitHub 上的 R 包,一开始代码很简单,但是很实用,不妨贴出来:

install_github = function(pkg) {
  url = paste0("https://hub.fastgit.org/", pkg, ".git")
  remotes::install_git(url) 
}

继续更新 ipkg 包方便你我他

fastgit 这个镜像网站对我就是昙花一现,还好最近找到另外两个代理网站,ipkg 包的代码也进一步完善2,这两个代理网站只要有一个能正常连接就行,最新版的代码不妨也放出来:

# Install GitHub packages via the proxy site
install_github = function(
    repo,
    subdir = NULL,
    ref = NULL,
    upgrade = c("default", "ask", "always", "never"),
    force = FALSE,
    quiet = FALSE,
    build = TRUE
) {
  # Alternate proxy address
  proxy = c(
    "https://ghproxy.com/",
    "https://gh-proxy.com/"
  )
  # Determine a proxy address
  if (conn_test(proxy[1]) == "ok") {
    proxy_url = paste0(proxy[1], "https://github.com/", repo, ".git")
  } else {
    proxy_url = paste0(proxy[2], "https://github.com/", repo, ".git")
  }
  # Install GitHub package
  remotes::install_git(
    url = proxy_url,
    subdir = subdir,
    ref = ref,
    upgrade = upgrade,
    force = force,
    quiet = quiet,
    build = build
  ) 
}

其中 conn_test() 用来测试网站是否连接正常,代码如下:

# Connection test
conn_test = function(url) {
  result = ""
  tryCatch(
    {
      response = httr::GET(url)
      if (httr::status_code(response) == 200) {
        result = "ok"
      } else {
        result = "no"
      }
    }, 
    error = function(e) {}
  )
  return(result)
}

与此同时,我顺便写了个下载文件的函数,在此就不过多介绍了,ipkg 包已发布到 CRAN 上了,详见:https://CRAN.R-project.org/package=ipkg

靠谱的终极备用杀招留待后用

统计之都上的一篇帖子,我才了解到于淼教授等人开发的一个关于 R 的博客聚合网站,我很好奇,也依葫芦画瓢通过 GitLab CI + Rocker 重现了一遍3,受益匪浅。后来我发现 GitLab CI + Rocker 可以干的事情还很多,比如生日当天给好友发祝福邮件等定时任务,我还专门写了一篇文章介绍如何使用他们,详见《当 Rocker 遇到 GitLab CI》,只不过这篇文章以画图为例,其实代码改为 download.file() 就可以很方便的下载任何网站的文件。


  1. 这个网站后来改为 https://hub.fastgit.xyz,再后来就打不开了。 ↩︎

  2. 完全是套壳 download_file()remotes::install_github()↩︎

  3. 不要问我为什么不用 GitHub Action,一来是打开 GitHub 实在是龟速啊,二来我被墙怕了,有阴影。 ↩︎