自动生成R源代码以构建包

时间:2015-11-25 22:44:05

标签: json r cran

我写了一个API绑定并将所有内容放入R包中,包括测试,晕影等,但API不断变化。这带来了一些问题

  • 更新我的软件包容易出错,也许我会错过一个新功能或忘记将旧标记为已弃用
  • 将包裹提交给CRAN并不是一个好主意,因为它会经常更改并且包裹会被手工审核
  • 我很难保持这个软件up2date,因为API的机会不规则,因此我可能会想念它们

我想出了自动生成绑定的想法。 API本身通过在线JSON文档提供了所需的一切。这些文档不断反映API的当前定义。

编写一些将JSON文档转换为R函数的代码不是问题。但如果我这样做,我仍然需要更新CRAN上的包。最好的解决方案是,创建一个(在加载时)查找API定义并创建所需函数的包。理想情况下,这些功能应进行单元测试。

我很感激任何提示。

最佳

修改:API为firebrowse API,其中an example为输入内容。

2 个答案:

答案 0 :(得分:1)

这非常具有挑战性,因此没有明显的方法可以做到这一点。 wsdl背后的整个想法是能够使用标准化的XML描述轻松完成。这在R中从未真正实现过,它从未真正起步过多(因为RESTful服务和JSON的出现)。

你绝对可以通过创建一个所谓的&#34;函数工厂来动态生成函数。 (哈德利对此进行了一些讨论here)。简而言之,您编写了一个函数,该函数将JSON作为输入并返回一个函数,该函数执行JSON中描述的任何操作。 (创建这样一个工厂,无论何时加载包都会动态地执行此操作似乎有风险,但我认为这是可能的。我可能只是让工厂自己使用它来创建和更新包。)< / p>

我不打算专门处理你的API,但要看看它是如何工作的:

# create factory with arguments to control returned function
factory <- function(action, endpoint, content = TRUE, parsed = FALSE) {
    if (content) {
        if(parsed) {
            out <- function() httr::content(httr::VERB(action, endpoint))
        } else {
            out <- function() httr::content(httr::VERB(action, endpoint), "text")
        } 
    } else {
            out <- function() httr::VERB(action, endpoint)
    }
    return(out)
}

# use factory to create different functions
(a <- factory("GET", "http://example.com", content = TRUE, parsed = FALSE))
## function() httr::content(httr::VERB(action, endpoint), "text")

(b <- factory("GET", "http://example.com", content = TRUE, parsed = TRUE))
## function() httr::content(httr::VERB(action, endpoint))

(c <- factory("GET", "http://example.com", content = FALSE))
function() httr::VERB(action, endpoint)

# evaluate each function
a() # returns a character string
b() # returns parsed HTML
c() # returns an httr response object

答案 1 :(得分:1)

  

最好的解决方案是创建一个(在加载时)查找API定义并创建所需函数的包。理想情况下,这些功能应进行单元测试。

这是一个众所周知的问题。在不破坏客户端的情况下对服务器更改做出反应不仅在您的情况下是痛苦的,而且对于移动应用程序也是如此(每次API更改时都需要重新提交)。

虽然您的方法可行(即时生成客户端),但如果服务器可以协作以达到成就,则可以达到最佳结果。

您必须将客户端与API实现分离。怎么样?使用REST(实际),引入状态和转换的概念。

这不是解释它如何运作的正确位置,但可以在此great presentation by Glenn Block中找到一个很好的介绍,然后继续阅读。

这不会解决您的特定问题,但在我看来,这是解决问题的正确方法。

您可能希望查看this video as well,15:24部分。