首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在R Plumber序列化程序之间切换

在R Plumber序列化程序之间切换
EN

Stack Overflow用户
提问于 2020-10-16 03:37:38
回答 1查看 256关注 0票数 1
代码语言:javascript
复制
#* @get /json
#* @serializer unboxedJSON
function() {
  return(iris)
}

#* @get /csv
#* @serializer csv list(type="text/plain; charset=UTF-8")
function() {
  return(iris)
}

#* @param type csv or json
#* @get /data
function(type = 'csv') {
  if (type == 'cvs') {
    #* @serializer csv list(type="text/plain; charset=UTF-8")
    return(iris)
  } else {
    #* @serializer unboxedJSON
    return(iris)
  }
}

上面的前2个端点可以正常工作,但第三个端点不能工作,因为#* @serializer unboxedJSON看起来不能在函数内部。然而,如果我能以某种方式拥有一个在返回之前处理序列化的端点,那就太好了。plumberplumber::serializer_csvplumber::serializer_unboxed_json()以及它们的所有序列化程序作为函数,但是我不确定如何在端点函数中使用它们(或者这是否可能)。

谢谢!

EN

回答 1

Stack Overflow用户

发布于 2021-03-11 04:29:30

您可以创建一个自定义序列化程序,该序列化程序根据响应对象更改序列化格式。下面是一个例子。在本例中,我将一个属性附加到我的响应中,以提供我想要的格式:

代码语言:javascript
复制
library(plumber)

#* @apiTitle Example Plumber API with Serializer to switch formats using object
#* attributes

serializer_switch <- function() {
  function(val, req, res, errorHandler) {
    tryCatch({
      format <- attr(val, "serialize_format")
      if (is.null(format) || format  == "json") {
        type <- "application/json"
        sfn <- jsonlite::toJSON
      } else if (format == "csv") {
        type <- "text/csv; charset=UTF-8"
        sfn <- readr::format_csv
      } else if (format == "rds") {
        type <- "application/rds"
        sfn <- function(x) base::serialize(x, NULL)
      }
      val <- sfn(val)
      res$setHeader("Content-Type", type)
      res$body <- val
      res$toResponse()
    }, error = function(err) {
      errorHandler(req, res, err)
    })
  }
}

register_serializer("switch", serializer_switch)

#* Return a data frame of random values
#* @param n size of data frame
#* @param format one of "json", "csv", or "rds"
#* @serializer switch
#* @get /random_df
function(n = 10, format = "json") {
  out <- data.frame(value = rnorm(n))
  attr(out, "serialize_format") <- format
  out
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64378575

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档