我的目标是创建一个R函数(或一组R函数)来搜索Github(可能通过the search API或其他方式)来识别Github上可用的R包。这将模仿R的available.packages()
功能,但是对于CRAN上的软件包的开发版本(而不是)。
我觉得这很容易。似乎不是。
可以从搜索使用语言R的所有存储库开始。The result是大约8,199个存储库。但其中许多不是R包,而是书籍,课程,或只是杂项。我希望能够将搜索结果提供给devtools::install_github
函数,这显然会对那些实际上不是包的内容失败。
那么,有没有办法确定Github存储库是否是R包?我的直觉是能够通过它们与众不同的特征来识别包装:
但我对如何做到这一点感到迷茫。显然,可以下载每个存储库(如devtools::install_github
一样,然后检查它是否是一个包,但这似乎过多了。)
任何见解? (我不一定在这里寻找完整的解决方案。)
答案 0 :(得分:1)
您需要的只是一个您喜欢的语言的解析库。我从来没有在R中做过(通常,我使用Python),但我认为你会找到一些东西。如果用于解析wiil的R工具不够方便,可以使用另一种语言来解析数据,使用R来处理它。
您的搜索请求的网址是
https://github.com/search?p=1&q=language%3AR&ref=simplesearch&type=Repositories
然后看看分页块。
<span class="disabled prev_page">◀</span>
<span class="current">1</span>
<a href="/search?p=2&q=language%3AR&ref=simplesearch&type=Repositories" rel="next">2</a>
<a href="/search?p=3&q=language%3AR&ref=simplesearch&type=Repositories">3</a>
<a href="/search?p=4&q=language%3AR&ref=simplesearch&type=Repositories">4</a>
<a href="/search?p=5&q=language%3AR&ref=simplesearch&type=Repositories">5</a>
<a href="/search?p=6&q=language%3AR&ref=simplesearch&type=Repositories">6</a>
<a href="/search?p=7&q=language%3AR&ref=simplesearch&type=Repositories">7</a>
<a href="/search?p=8&q=language%3AR&ref=simplesearch&type=Repositories">8</a>
<a href="/search?p=9&q=language%3AR&ref=simplesearch&type=Repositories">9</a>
<span class="gap">…</span>
<a href="/search?p=99&q=language%3AR&ref=simplesearch&type=Repositories">99</a>
<a href="/search?p=100&q=language%3AR&ref=simplesearch&type=Repositories">100</a>
<a href="/search?p=2&q=language%3AR&ref=simplesearch&type=Repositories" class="next_page" rel="next">▶</a></div>
您可以使用解析选择器在此处获取页码(100)。然后,您可以解析所有repos标题和链接。他们看起来像
<h3 class="repolist-name">
<a href="/hadley/devtools" class="css-truncate css-truncate-target">hadley/devtools</a>
</h3>
使用网址并将页面从1更改为最大可以获得所有回购和链接。然后看一下repo页面。例如,我们正在寻找NAMESPACE。
<td class="content">
<span class="css-truncate css-truncate-target"><a href="/hadley/devtools/blob/master/NAMESPACE" class="js-directory-link" id="7347fe5a0f184f79ef064e92e3beb297-5343453e5cabfcbdea6f829e232c6f994af44719" title="NAMESPACE">NAMESPACE</a></span>
</td>
只需搜索css-class“js-directory-link”,你就可以找到很多东西。
要做的最后一件事就是制定某种能够产生决定的逻辑!