plotly:在存储的 JSON 字符串中公开 "config" 对象,以便于与 Plotly.JS 函数一起使用

plotly: exposing the "config" object in the stored JSON string, for easier use with Plotly.JS functions

我不知道这是一个情节问题还是htmlwidgets问题。也许两者兼而有之。

我正在使用 R 来制作 plotly 小部件,这些小部件 - 当由 R 制作时 - 也是 htmlwidgets。当以这种方式制作 plotly 小部件时,生成的 HTML 包含一个字符串化的 JSON 对象,其中包含小部件的数据和一些设置。但是只有这个 JSON 对象的某些部分可以从 Javascript 控制台轻松访问。例如,"data" 和 "layout" 对象很容易访问,但 "config" 对象则不然。为什么会这样——是否可以通过其他方式轻松访问 "config" 对象?

这是一个示例,从创建 Plotly 小部件的 R 代码开始:

  library(plotly)
  data(iris)
  myPlot <- plot_ly(
      x     = ~Petal.Length, y = ~Petal.Width, 
      color = ~Species,
      data  = iris)
  myPlot$elementId <- "myExample"  
  myPlot

此代码生成一个 HTML 页面,显示 plotly 小部件。该页面包含一个 <script type="application/json" data-for="myExample"> 容器,该容器又包含一个字符串化的 JSON 对象。根据上面的代码,JSON 对象具有以下结构:

{
VALID (RFC 8259)
Formatted JSON Data
{
  "x":{
    "attrs":{},
    "layout":{},
    "config":{
      "showSendToCloud":false
    },
    "data":[],
    "highlight":{},
  },
  "evals":[],
  "jsHooks":[]
}

(为简洁起见,我在 x 中省略了一些对象。我还隐藏了大多数对象的内容;例如,attrslayout 是'真的是空的。)

从 Javascript 控制台(例如,在 Chrome 中),可以轻松访问 "data" 数组和 "layout" 对象:

el = document.getElementById("myExample");
typeof el.data;    # "object"
el.data.length;    # 3
typeof el.layout;  # "object"
typeof el.config;  # "undefined"

我可以通过键入 el.data 访问数据数组,我可以用同样的方式访问布局对象。为什么我不能仅通过键入 el.config 来访问配置对象?有没有办法让 "config" 像 "data" 和 "layout" 一样容易访问?

我问是因为一些 Plotly.js 函数,比如 Plotly.react(),需要一个 "config" 对象。如果可以轻松访问 "config" 对象,这样的函数会更容易使用。

我知道 "config" 对象可以通过其他方式访问,例如 JSON.parse()。但是上面使用的方法——只需调用 el.datael.layout——要容易得多,这就是为什么我也想将它用于配置数据。

如果您真的想访问 "config" 对象,您可能需要这样做 the hard way,即使用 JSON.parse()。但是,如果您只想更新配置对象,然后更新您的 Plotly 图,则至少有两种选择:

  1. 将未命名的对象传递给 Plotly.react()。示例:Plotly.react(el.data, el.layout, {"showSendToCloud" : true} ).

  2. 使用 Plotly.setPlotConfig() 后接 Plotly.react(). 示例:

    Plotly.setPlotConfig( { "showLink" : true } );
    Plotly.react(el, el.data, el.layout, {} );

(奇怪的是,Plotly.setPlotConfig() 在 Plotly 文档中似乎没有自己的条目,尽管在文档的其他部分中提到了它。)