使用 toJSON 将不带引号的 javascript 传递给 Highcharts
Passing unquoted javascript to Highcharts using toJSON
使用 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 引用颜色值 属性
shiny 提供了用于包装文字 javascript 的 JS() 但 RJSONIO 忽略了它并且 jsonlite 抱怨 class 缺少一个 asJSON 方法JS_EVAL.
有没有其他方法可以选择性地防止引用 toJSON 输出?
您不能使用 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)
您需要 rCharts 作者的支持。两种方法:
- 简单的方法:使用 htmlwidgets 框架。然后你需要做的就是将你的JS代码放在
htmlwidgets::JS()
中。 JS代码将被自动保存和评估。
- 更难的方法:重新发明我们在 htmlwidgets 中所做的事情。我不明白为什么有人想要这样做。不管怎样,如果你关心血淋淋的细节,我们所做的基本上是:
JS()
在字符串中添加了一个classJS_EVAL
,我们找出这样的字符串的位置(例如series[2].color
);
- 在 JavaScript 一侧,找到并
eval()
那些字符串;
使用 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 引用颜色值 属性
shiny 提供了用于包装文字 javascript 的 JS() 但 RJSONIO 忽略了它并且 jsonlite 抱怨 class 缺少一个 asJSON 方法JS_EVAL.
有没有其他方法可以选择性地防止引用 toJSON 输出?
您不能使用 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)
您需要 rCharts 作者的支持。两种方法:
- 简单的方法:使用 htmlwidgets 框架。然后你需要做的就是将你的JS代码放在
htmlwidgets::JS()
中。 JS代码将被自动保存和评估。 - 更难的方法:重新发明我们在 htmlwidgets 中所做的事情。我不明白为什么有人想要这样做。不管怎样,如果你关心血淋淋的细节,我们所做的基本上是:
JS()
在字符串中添加了一个classJS_EVAL
,我们找出这样的字符串的位置(例如series[2].color
);- 在 JavaScript 一侧,找到并
eval()
那些字符串;