使用toJSON将未加引号的javascript传递给Highcharts

时间:2016-04-27 11:36:11

标签: r shiny rcharts jsonlite rjsonio

使用有光泽和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引用color属性的值

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

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

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

你不能用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)