水管工 R 渲染一个 svg 文件

Plumber R Render a svg file

我正在使用 plumber 1.0.0 创建一个 API GET,我想渲染一个具有动态分辨率的 svg

阅读 documentation 我们发现可以以静态方式更改分辨率。 但我需要 API 使用参数调用此函数以进行解析(响应)。

我最后的尝试是创建 svg 文件并保存为临时文件,然后我想“读取”这个保存的 svg 文件和 return 作为输出保存为 svg 的图形。

有人知道怎么做吗?

我用 png 尝试了相同的逻辑,并且成功了。

但是当我尝试加载 svg 文件时,无法正常工作...

谢谢!

serializer_svg ultimatly 调用 grDevices::svg,它应该会告诉您设备上有哪些选项可用。通常它们是在解析时设置的,但您可以使用类似这种丑陋的技巧动态覆盖它们。

我们确保使用将在设备打开之前执行的过滤器来设置请求的值。

library(plumber)

device_size <- function() {
  h_ <- 7
  w_ <- 7
  list(
    h = function() h_,
    w = function() w_,
    set_h = function(h) if (!is.null(h)) {h_ <<- as.numeric(h)},
    set_w = function(w) if (!is.null(w)) {w_ <<- as.numeric(w)}
  )
}

output_size <- device_size()

serializer_dynamic_svg <- function(..., type = "image/svg+xml") {
  serializer_device(
    type = type,
    dev_on = function(filename) {
      grDevices::svg(filename,
                     width = output_size$w(),
                     height = output_size$h())
    }
  )
}
register_serializer("svg", serializer_dynamic_svg)

#* @filter dynamic_size
function(req) {
  if (req$PATH_INFO == "/plot") {
    output_size$set_w(req$args$width)
    output_size$set_h(req$args$height)
  }
  plumber::forward()
}

#* @get /plot
#* @param width
#* @param height
#* @serializer svg
function() {
  plot(iris)
}