首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用R的水管工-创建GET端点来托管CSV格式的数据,而不是JSON

使用R的水管工-创建GET端点来托管CSV格式的数据,而不是JSON
EN

Stack Overflow用户
提问于 2018-03-06 22:39:35
回答 2查看 3K关注 0票数 4

我认为这是R的水管工库的一个很好的快速演示,但主要是我很难以csv格式提供数据

我正在使用R的水管工包来托管我的一些体育数据的API端点。目前,我有一些数据,抓取总冠军的MLB棒球队,我试图发球。使用水管工,我设置了以下两个脚本:

setupAPI.R:使用两个GET端点设置API:

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

# load in some test sports data to host
mydata = structure(list(Team = structure(c(8L, 20L, 7L, 28L, 2L, 30L, 
23L, 1L, 6L, 19L), .Label = c("Angels", "Astros", "Athletics", 
"Blue Jays", "Braves", "Brewers", "Cardinals", "Cubs", "Diamondbacks", 
"Dodgers", "Giants", "Indians", "Mariners", "Marlins", "Mets", 
"Nationals", "Orioles", "Padres", "Phillies", "Pirates", "Rangers", 
"Rays", "Red Sox", "Reds", "Rockies", "Royals", "Tigers", "Twins", 
"White Sox", "Yankees"), class = "factor"), GamesPlayed = c(162L, 
162L, 162L, 162L, 162L, 162L, 162L, 162L, 162L, 162L), CurrentWins = c(92L, 
75L, 83L, 85L, 101L, 91L, 93L, 80L, 86L, 66L)), .Names = c("Team", 
"GamesPlayed", "CurrentWins"), row.names = c(NA, 10L), class = "data.frame")

# create a GET request for shareprices (in JSON format)
#* @get /shareprices_json
getSPs <- function(){ 
  return(toJSON(mydata))
}

# create a GET request for MLB shareprices (in CSV format)
#* @get /shareprices_csv
csvSPs <- function(){
  return(mydata)
}

# run both functions (i think needed for the endpoints to work)   
getSPs()
csvSPs()

RunAPI.R:plumbssetupAPI.R,获取本地托管的端点

代码语言:javascript
复制
library(plumber)
r <- plumb("setupAPI.R") 
r$run(port=8000)

。。。

在我的控制台中运行RunAPI.R代码之后,当我到达端点时,我的csv端点显然是返回一个JSON对象,而我的json端点似乎奇怪地返回了一个长度为1的JSON,其中一个字符串中的JSON作为返回的JSON中的唯一元素。

简而言之,我现在可以看到,我应该只返回dataframe,而不是toJSON( dataframe),才能让端点主机JSON格式化数据,但是我仍然不知道如何以CSV格式提供这些数据。这在水管工中有可能吗?在setupAPI.R中的函数中,返回语句应该是什么样的呢?任何帮助都将不胜感激!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-03-07 15:27:17

在这里你需要两个技巧:

  1. 通过直接返回响应对象,可以绕过端点上的序列化。更多的docs 这里
  2. 您可以通过变异res$body来指定响应的主体。

可以将这两种想法结合起来创建一个端点,如下所示:

代码语言:javascript
复制
#' @get /data.csv
function(res) {
  con <- textConnection("val","w")
  write.csv(iris, con)
  close(con)

  res$body <- paste(val, collapse="\n")
  res
}

请注意,水管工免费为您做一些好事,比如为您的JSON响应设置适当的HTTP头。如果您是自己发送响应,那么您就需要自己完成所有这些任务,因此您需要确保设置适当的头来指导API客户端如何解释这个响应。

票数 4
EN

Stack Overflow用户

发布于 2018-04-11 11:37:12

只要张贴这个答案,如果帮助任何人!

Jeff的响应非常好,但是当您必须返回一个大CSV文件时,它会变得非常慢。我被一个22 MB的文件卡住了。

如果您以前在磁盘上编写CSV,一个更快的解决方案是使用include_file函数(docs 这里):

例如:

代码语言:javascript
复制
#* @get /iris_csv
getIrisCsv <- function(req, res) {
    filename <- file.path(tempdir(), "iris.csv")
    write.csv(iris, filename, row.names = FALSE)
    include_file(filename, res, "text/csv")
}

因此,这取决于您的用例:

  • 如果您返回一个小csv,并且不想将它写入磁盘:使用Jeff的解决方案
  • 如果您的CSV是中型或大型(> 2MB),或者您已经将它放在磁盘上:使用include_file解决方案

希望能帮上忙!

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49141217

复制
相关文章

相似问题

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