在我的应用程序中,我根据用户输入和他们上传的数据集创建绘图。我现在想添加功能以在新标签中显示情节,而不仅仅是提供正常的downloadHandler
。
这是我当前实现的简化版本。 (注意:此处发布的两个示例在RStudio浏览器中都不起作用。使用外部浏览器)
library(shinyjs)
library(shiny)
library(ggplot2)
addResourcePath(prefix = "plot", tempdir())
save_plot <- function(input, path) {
n <- input$n
df <- data.frame(x = 1:n, y = cumsum(rnorm(n)))
gg <- ggplot(df, aes(x,y)) + geom_line()
ggsave(gg, filename = path)
}
shinyApp(
fluidPage(
useShinyjs(),
sliderInput("n", "n", 100, 1000, 500),
actionButton("newtab", "open plot in new tab")
),
function(input, output, session){
observeEvent(input$newtab, {
save_plot(input, file.path(tempdir(), "plot.png"))
shinyjs::runjs("window.open('plot/plot.png', '_blank')")
})
}
)
我对此实现的问题是弹出窗口阻止程序(相当安静地)阻止新选项卡打开。我不想让我的用户只是为了使用我的网络应用程序来禁用他们的弹出窗口阻止程序。
我尝试的另一件事是使用链接并听取这样的点击
shinyApp(
fluidPage(
useShinyjs(),
sliderInput("n", "n", 100, 1000, 500),
tags$a(id = "link", href = "plot/plot.png", target = "_blank",
"open plot in new tab")
),
function(input, output, session){
shinyjs::onclick("link", {
save_plot(input, file.path(tempdir(), "plot.png"))
})
}
)
这里,第一个图看起来不错,但是当第二次按下时,会显示旧图,因为save_plot
比创建新标签需要更长的时间。另外,我希望能够设置触发新标签的ui元素的样式,而不是仅限于链接。
我觉得我已经非常接近满意的解决方案了。任何帮助将不胜感激。