有没有一种方法可以在shiny中仅使用Javascript命令进行绘图

问题描述 投票:0回答:1

我正在尝试仅使用 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 来做到这一点。

javascript shiny
1个回答
0
投票

这种方法对我来说似乎有缺陷。

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 个数据作为参数调用该处理程序,但同样,您实际上是在重新发明轮子。

© www.soinside.com 2019 - 2024. All rights reserved.