我正在尝试仅使用 javascript 来绘制闪亮的图表。谁能帮我实现下面的目标
library(shiny)
ui <- fluidPage(
#htmlOutput("d"),
tags$p(id = 'g', class = 'newClass', 'This is a plot'),tags$p(id = "demo"),
tags$script(HTML("var tit = document.getElementById('g');tit.onclick = function (){document.getElementById('demo').innerHTML = Date()}"))
)
server <- function(input, output, session) {
}
shinyApp(ui, server)
这是一个应用程序,当用户点击内容时,日期显示在下面
现在,我们可以更改此设置,以便当用户单击内容时,应该出现一个图
plot_ly(iris, x = ~Species, y = ~Petal.Length)
。我知道我们可以使用闪亮的功能(使用按钮)以某种方式实现。但想知道我们是否可以仅使用 JS 来做到这一点。
这种方法对我来说似乎有缺陷。
shiny
的整体思想是封装 JavaScript 功能并允许将 R
对象方便地传递到底层 JavaScript 层。您正在尝试重新实现轮子。
话虽如此,当然也可以从
shiny
中运行任意 JS 代码。 plotly
是另一个基于 JavaScript 的绘图库,所以你可以(我不是说你应该)通过 JS 调用它。
你会遇到一些关于如何将
R
数据(iris
)传递给JS的麻烦,但同样这是可能的。最后,您将得到一些自定义代码,这些代码试图模仿闪亮的功能,开箱即用,并且更可靠。
但是正如您所要求的,这里有一个 MWE:
library(shiny)
library(jsonlite)
library(dplyr)
library(plotly)
make_plotly <- HTML(
"
$(function() {
const data = JSON.parse($('#iris').text());
const container = $('#plotly_byhand')[0];
Plotly.newPlot(container, [{...data, type: 'scatter', mode: 'markers'}]);
})
")
ui <- fluidPage(
tags$script(src = "https://cdnjs.cloudflare.com/ajax/libs/plotly.js/2.35.0/plotly.min.js"),
tags$script(
id = "iris",
type = "application/json",
toJSON(iris %>% select(x = Species, y = Petal.Length), dataframe = "columns")
),
tags$script(
make_plotly
),
div(
id = "plotly_byhand",
style = "width: 100%; height: 100%"
)
)
server <- function(input, output, session) {
}
shinyApp(ui, server)
想法是,首先将数据作为 JSON 对象存储在文件中,然后在 Plotly 代码中解析该数据,从而进行绘图。另一种方法是使用
Shiny.addCustomMessageHandler
添加一个新的 JS 处理程序,然后您可以从 R 个数据作为参数调用该处理程序,但同样,您实际上是在重新发明轮子。