Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何创建自定义JS函数将plotly图像复制到R中的剪贴板_Javascript_R_Shiny_Plotly_R Plotly - Fatal编程技术网

Javascript 如何创建自定义JS函数将plotly图像复制到R中的剪贴板

Javascript 如何创建自定义JS函数将plotly图像复制到R中的剪贴板,javascript,r,shiny,plotly,r-plotly,Javascript,R,Shiny,Plotly,R Plotly,我想在plotly图表上实现一个按钮,该按钮将打印复制到用户的剪贴板,类似于快照按钮将打印的png下载为文件的方式 我参考了创建自定义modebar按钮,但我对Javascript还不太熟悉,不知道如何编写该代码段(或者如果可能的话) 下面是我编写的R代码,尝试一下,但它不起作用。确实会出现一个按钮(虽然图像不可见,但如果我将鼠标悬停在最右上角,我可以在那里看到它)。但当我单击它时,绘图不会复制到剪贴板,chrome控制台会显示: 未捕获类型错误:Plotly.execCommand不是函数 在

我想在plotly图表上实现一个按钮,该按钮将打印复制到用户的剪贴板,类似于快照按钮将打印的png下载为文件的方式

我参考了创建自定义modebar按钮,但我对Javascript还不太熟悉,不知道如何编写该代码段(或者如果可能的话)

下面是我编写的R代码,尝试一下,但它不起作用。确实会出现一个按钮(虽然图像不可见,但如果我将鼠标悬停在最右上角,我可以在那里看到它)。但当我单击它时,绘图不会复制到剪贴板,chrome控制台会显示:

未捕获类型错误:Plotly.execCommand不是函数 在Object.eval[单击时](在tryEval时评估((索引):258),:2:15) 在兰开夏。(:7:2055670)

图:

我的代码:

library(plotly)
图书馆(闪亮)

d我不知道如何处理工具栏,但下面是如何通过单击按钮将图像复制到剪贴板:

库(闪亮)
图书馆(绘本)

d如果有人想在工具栏/模式栏中找到具体的操作方法,我从下面修改了Stephane Laurent的答案,以使其发挥作用

然而,仍然存在的问题是:

  • 最初单击按钮会将图表复制到剪贴板,但大小与屏幕上最初显示的大小不同。如果您完全更改了图表,即使只是简单地更改浏览器窗口的大小,然后再次单击按钮,复制的图表看起来与浏览器中的完全相同(理想行为)
  • 设置
    {format:“png”,高度:400,宽度:800}
    似乎没有明确定义复制图表的大小
  • 图标不会出现在按钮上,尽管文件与应用程序位于同一目录中
  • 完整代码:

    library(plotly)
    library(shiny)
    
    d <- data.frame(xaxis = c(1,2,3,4,5), 
                    ydata = c(10,40,60,30,25))
    
    p <- plot_ly() %>%
      add_trace(data = d,
                x = ~xaxis,
                y = ~ydata,
                type = "scatter", mode = "lines")
    
    plotClip <- list(
      name = "plotClip",
      icon = list(
        path = "plotClip.svg",
        transform = 'matrix(1 0 0 1 -2 -2) scale(0.7)'
      ),
      click = htmlwidgets::JS(
        'function(gd) {
           Plotly.Snapshot.toImage(gd, {format: "png"}).once("success", function(url) {
                copyImage(url);
              });
           alert("Copied the plot");
        }'
      )
    )
    
    p <- p %>%
      config(modeBarButtonsToAdd = list(plotClip),
             displaylogo = FALSE,
             toImageButtonOptions= list(filename = "plot.png",
                                        format = "png",
                                        width = 800, height = 400))
    
    copyImgTag <- tags$script(
      'async function copyImage(url) {
              try {
                const data = await fetch(url);
                const blob = await data.blob();
                await navigator.clipboard.write([
                  new ClipboardItem({
                    [blob.type]: blob
                  })
                ]);
                console.log("Image copied.");
              } catch (err) {
                console.error(err.name, err.message);
              } 
            }'
    )
    
    ui <- tagList(
      fluidPage(
        plotlyOutput(outputId = "myplot")
        ), 
      copyImgTag
    )
    
    server <- function(input, output) {
      output$myplot <- renderPlotly({
        p
      })
    }
    
    shinyApp(ui, server)
    
    library(plotly)
    图书馆(闪亮)
    
    这太好了。我不得不使用NS()对其进行一些修改,因为我的过程是在一个闪亮的模块中完成的。我还必须确保这个标签脚本出现在适当的时间。。。也就是说,在图表生成之后。是否有明确定义图像大小的方法?我试着使用{format:“png”,高度:400,宽度:800},但没有成功。我的问题是,在我的应用程序中第一次使用按钮会产生一个奇怪大小的图表,但是如果我以任何方式修改图表并重新尝试按钮,它看起来很正常(即,显示的大小)-实际上,这只是第一次使用,这很奇怪。