代码之家  ›  专栏  ›  技术社区  ›  kjellhaakon

使用ojs_define将日期从R区块传递到ojs区块i Quarto

  •  1
  • kjellhaakon  · 技术社区  · 3 年前

    我在一个quarto文档中使用R和ojs代码块,在那里我在R中进行数据操作,并通过使用 ojs_define 作用

    我的问题是,日期似乎被解释为ojs块中的字符串。结果是打印格式不正确。

    关于如何以项目绘图功能将日期识别为日期的方式将日期从r传递到项目,有什么提示吗?

    示例:

    ---
    title: "Code example"
    format: html
    editor: visual
    execute:
      echo: false
      warning: false
    ---
    
    ```{r}
    #Some data with a date column
    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)
    ```
    
    
    ```{ojs}
    
    Chart = Plot.plot({
      marks: [
        Plot.line(transpose(plot_data), 
          {x: "day", y: "values"}, 
          { stroke: "black" }
        )
      ]}
    )
    ```
    
    0 回复  |  直到 3 年前
        1
  •  2
  •   Shafee ikashnitsky    3 年前

    由于日期在通过时被解析为字符串 ojs_define ,我们可以在ojs块中将字符串日期类型转换回日期时间类型。

    在这里我们将使用 d3.timeParse 创建一个日期时间解析器,并将使用 Arquero 图书馆(灵感来自的设计 dplyr )到 derive (即突变) day 列的日期时间值。

    这里有两件事需要注意,

    1. Arquero work with data tables 。但是 plot_data 是JSON格式。所以我们需要 transpose 将其转换为对象数组,然后将其传递给 aq.from to convert as table

    2. 使用它 parser 在内部 得到 ,我们需要包装 d => parse(d) 具有 aq.escape

    ---
    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)
    ```
    
    ```{ojs}
    import { aq } from '@uwdata/arquero'
    d3 = require("d3@7")
    parser = d3.timeParse("%Y-%m-%d");
    ```
    
    ## Plot
    
    ```{ojs}
    final_data = aq.from(transpose(plot_data))
      .derive({ day: aq.escape(d => parser(d.day)) })
    ```
    
    ```{ojs}
    Chart = Plot.plot({
      marks: [
        Plot.line(final_data, 
          {x: "day", y: "values"}, 
          { stroke: "black" }
        )
      ]}
    )
    ```
    

    observable plot with datetime axis