Javascript 如何创建自定义JS函数将plotly图像复制到R中的剪贴板
我想在plotly图表上实现一个按钮,该按钮将打印复制到用户的剪贴板,类似于快照按钮将打印的png下载为文件的方式 我参考了创建自定义modebar按钮,但我对Javascript还不太熟悉,不知道如何编写该代码段(或者如果可能的话) 下面是我编写的R代码,尝试一下,但它不起作用。确实会出现一个按钮(虽然图像不可见,但如果我将鼠标悬停在最右上角,我可以在那里看到它)。但当我单击它时,绘图不会复制到剪贴板,chrome控制台会显示: 未捕获类型错误:Plotly.execCommand不是函数 在Object.eval[单击时](在tryEval时评估((索引):258),:2:15) 在兰开夏。(:7:2055670) 图: 我的代码:Javascript 如何创建自定义JS函数将plotly图像复制到R中的剪贴板,javascript,r,shiny,plotly,r-plotly,Javascript,R,Shiny,Plotly,R Plotly,我想在plotly图表上实现一个按钮,该按钮将打印复制到用户的剪贴板,类似于快照按钮将打印的png下载为文件的方式 我参考了创建自定义modebar按钮,但我对Javascript还不太熟悉,不知道如何编写该代码段(或者如果可能的话) 下面是我编写的R代码,尝试一下,但它不起作用。确实会出现一个按钮(虽然图像不可见,但如果我将鼠标悬停在最右上角,我可以在那里看到它)。但当我单击它时,绘图不会复制到剪贴板,chrome控制台会显示: 未捕获类型错误:Plotly.execCommand不是函数 在
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},但没有成功。我的问题是,在我的应用程序中第一次使用按钮会产生一个奇怪大小的图表,但是如果我以任何方式修改图表并重新尝试按钮,它看起来很正常(即,显示的大小)-实际上,这只是第一次使用,这很奇怪。