首页 > 解决方案 > 如何以特定格式将数据框导出为 json

问题描述

我想在 Shiny App 中使用 downloadButton 下载数据框并将其导出到 json 文件。使用以下代码,它在浏览器中运行良好:

library(shiny)
library(jsonlite)

ui <- basicPage(
  downloadButton("downloadData", "Download Data")
)

server <- function(input, output) {
  
  data <- reactive({
    df <- data.frame(name = c("Jon", "Bill", "Maria"),
                     age = c(23, 41, 32))
  })

  output$downloadData <- downloadHandler(
    filename = function() {
      "data.json"
    },
    content = function(file) {
      write_json(data(), file)
    }
  )
}

shinyApp(ui, server)

但是,json文件的内容有以下格式:

[{"name":"Jon","age":23},{"name":"Bill","age":41},{"name":"Maria","age":32}]

如何获得以下格式?

{"name": ["Jon", "Bill", "Maria"], "age": [23, 41, 32]}

我阅读了write_json的文档,但显然可能性是有限的。因此,在 Shiny 上下文中工作的其他 json 导出函数也会有所帮助。

标签: rjsonshinyformatexport

解决方案


将 data.frame 视为列表:

write_json( as.list(data()), file )

一个简单的演示:

df <- data.frame(
    name = c("Jon", "Bill", "Maria"),
    age = c(23, 41, 32)
)
toJSON( as.list( df ) )

产生:

{"name":["Jon","Bill","Maria"],"age":[23,41,32]}

作为记录,(也许你已经知道了),data.frames 是形状和形式的列表,只有 row.names 和一个类:

> dput( df )
structure(list(name = c("Jon", "Bill", "Maria"), age = c(23, 
41, 32)), class = "data.frame", row.names = c(NA, -3L))

> dput( as.list(df) )
list(name = c("Jon", "Bill", "Maria"), age = c(23, 41, 32))

推荐阅读