【问题标题】:Passing unquoted javascript to Highcharts using toJSON使用 toJSON 将未引用的 javascript 传递给 Highcharts
【发布时间】:2016-04-27 11:36:11
【问题描述】:

使用 shiny 和 rCharts 创建仪表板应用程序,我需要将原始 javascript(不是字符串)传递给 Highcharts 对象。

鉴于此列表

series <- list(data = list(c(0, 0), c(100, 0), c(100, 100)),
               type = 'polygon',
               color = 'Highcharts.Color(Highcharts.getOptions().colors[0]).setOpacity(0.5).get()')

我需要生成这个 JSON

{series:[{
          data: [[0, 0], [100, 0], [100, 100]],
          type: 'polygon',
          color: Highcharts.Color(Highcharts.getOptions().colors[0]).setOpacity(0.5).get()
        }]
}

但我找不到任何方法来阻止 RJSONIO 或 jsonlte 引用颜色属性的值

闪亮的提供 JS() 用于包装文字 javascript,但 RJSONIO 忽略它,并且 jsonlite 抱怨缺少类 JS_EVAL 的 asJSON 方法。

是否有其他方法可以选择性地阻止引用 toJSON 输出?

【问题讨论】:

  • 嗨斯蒂芬。你试过highcharter吗?是基于 htmlwidgets 的 highcharts 包装器,因此您可以通过 JS() 函数传递 javascript。你看到这个问题stackoverflow.com/questions/27723555 了吗?使用"#! ... !#"发送javascript元素
  • Joshua,感谢您让我知道您的包裹。太棒了!

标签: r shiny rcharts jsonlite rjsonio


【解决方案1】:

您需要 rCharts 作者的支持。两种方法:

  1. 简单的方法:使用htmlwidgets 框架。然后你需要做的就是把你的JS代码放在htmlwidgets::JS()。 JS 代码将被自动保存和评估。
  2. 更难的方法:重新发明我们在 htmlwidgets 中所做的工作。我不明白为什么有人想要这样做。无论如何,如果您关心血腥细节,我们所做的基本上是:
    1. JS() 在字符串中添加了一个类JS_EVAL,我们可以找出这些字符串的位置(例如series[2].color);
    2. 在 JavaScript 端,找到并eval() 那些字符串;

【讨论】:

    【解决方案2】:

    您不能使用 json 库执行此操作的原因是您的代码显然不是 JSON 而是 JavaScript。一个技巧是将文字字符串视为 json:

    color <- 'Highcharts.Color(Highcharts.getOptions().colors[0]).setOpacity(0.5).get()'
    class(color) <- 'json'
    series <- list(data = list(c(0, 0), c(100, 0), c(100, 100)),
       type = 'polygon',
       color = color)
    
    jsonlite::toJSON(series, json_verbatim = TRUE, auto_unbox = TRUE)
    

    【讨论】:

    • 包的用户通常无法访问序列化程序jsonlite::toJSON()(这是包作者在内部完成的),因此他们可能无法真正设置json_verbatim = TRUE
    • @yihui 但json_verbatim = TRUE 不是shiny 和htmlwidgets 的默认值吗?
    • 是的。问题是 rCharts 不是基于 htmlwidgets 并且不使用 jsonlite。这就是为什么我要求 OP 向 rCharts 作者寻求帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多