在夸托中使用ojs_define将日期从R块传递到ojs块

pftdvrlh  于 2023-06-19  发布在  其他
关注(0)|答案(1)|浏览(69)

我在一个夸托文档中使用R和ojs代码块,我在R中进行数据操作,并通过使用ojs_define函数将 Dataframe 传递给ojs块。
我的问题是日期似乎在ojs块中被解释为字符串。结果是图中的格式不正确。
关于如何将日期从r传递到ojs,使ojs的plot函数将其识别为日期,有什么提示吗?
示例:

---
title: "Code example"
format: html
editor: visual
execute:
  echo: false
  warning: false
---

```{r}
#Some data with a date columm
library(tidyverse)

df<-data.frame(day=seq.Date(from=as.Date('2023-01-01'), 
                            to=as.Date('2023-06-15'), 
                            by='days'))%>%
  mutate(values=rnorm(mean= 10, sd=2, n =n()))

#Passing this to ojs through ojs_define

ojs_define(plot_data=df)

Chart = Plot.plot({
  marks: [
    Plot.line(transpose(plot_data), 
      {x: "day", y: "values"}, 
      { stroke: "black" }
    )
  ]}
)
arknldoa

arknldoa1#

由于日期在通过ojs_define时被解析为字符串,因此我们可以在ojs块中将string-dates类型转换回datetime类型。
在这里,我们将使用d3.timeParse来创建一个datetime解析器,并将使用Arquero库(受dplyr的设计启发)来derive(即突变)day列以获得datetime值。
这里有两点需要注意

  1. Arquero使用数据表。但是plot_data是JSON格式。因此,我们需要transpose将其转换为对象数组,然后将其传递给aq.from以转换为表。
    1.要在derive中使用该parser,我们需要用aq.escape Package d => parse(d)
---
title: "Code example"
format: html
execute:
  echo: false
  warning: false
---

```{r}
library(dplyr)

df <- data.frame(day = seq.Date(
        from = as.Date('2023-01-01'),
        to = as.Date('2023-06-15'),
        by = 'days'
      )) %>%
  mutate(
    values = rnorm(mean = 10, sd = 2, n = n())
  )

ojs_define(plot_data=df)
import { aq } from '@uwdata/arquero'
d3 = require("d3@7")
parser = d3.timeParse("%Y-%m-%d");

Plot

final_data = aq.from(transpose(plot_data))
  .derive({ day: aq.escape(d => parser(d.day)) })
Chart = Plot.plot({
  marks: [
    Plot.line(final_data, 
      {x: "day", y: "values"}, 
      { stroke: "black" }
    )
  ]}
)

![](https://i.stack.imgur.com/ctAbL.png)

相关问题