R Shiny downloadHandler 返回应用程序 html 而不是绘图或数据

标签 r ggplot2 module shiny

我只是想从由模块和绘图辅助函数构建的应用程序返回用户生成的绘图(内置 ggplot)或数据表。我已经看到很多关于 downloadHandler 非常挑剔的帖子,甚至似乎存在一些 downloadHandler 行为的未解决问题。我得到的奇怪行为是,我没有看到有关的帖子,它返回我的应用程序的 html 页面而不是情节,无论我如何尝试保存情节(即,使用 pdf/png 设备, ggsave() 等),或者我是否使用suspendWhenHidden。我可以在 Shiny 外部运行绘图保存代码,它工作正常。我在 Mac 上通过浏览器(Firefox,虽然 Chrome 也一样)运行所有这些,最近更新了所有内容。
下面的示例代码。

模块:

library(shiny)
library(ggplot2)
# UI module
modUI <- function(id, label="inputvalues") {
  ns <- NS(id)
  tagList(
    numericInput(ns("mean"), "Mean",value = NULL),
    numericInput(ns("sd"),"Std. Dev.",value = NULL),
    actionButton(ns("draw"),"Draw plot"),
    downloadButton(ns("dlPlot"), "Download Plot")
  )
}

# Server Logic module
mod <- function(input, output, session) {
  x <- reactiveValues(data=NULL)
  observeEvent(input$draw, {
    x$data <- rnorm(100,input$mean,input$sd)
  })

  return(list(dat = reactive({x$data}),
          m = reactive({input$mean}),
          s = reactive({input$sd})
          )
     )
}

绘图辅助函数:
showPlot <- function(data, m, s) {
  d <- data.frame(data)
  p <- ggplot(d, aes(x=d, y=d)) +
    geom_point() +
    geom_vline(xintercept=m)
  p
}

UI 和服务器调用:
ui <- navbarPage("Fancy Title",id = "tabs",
                 tabPanel("Panel1",value = 1,
                          sidebarPanel(
                            modUI("input1")
                          ),
                          mainPanel(plotOutput("plot1"))
                 )
)

server <- function(input, output, session) {
  y <- callModule(mod, "input1")
  output$plot1 <- renderPlot({ 
    if (is.null(y$dat())) return()
    showPlot(data.frame(y$dat()), y$m(), y$s())
  })

  output$dlPlot <- downloadHandler(
    filename="~Plot_Download.pdf",
    content=function(file){
      pdf(filename, file)
      p
      dev.off()
    }
  )
}

shinyApp(ui, server)

一如既往地感谢您的帮助!

最佳答案

终于找到了答案,很大程度上基于this post .答案是创建一个专门用于下载的服务器模块(它可以获取 session 和命名空间信息),然后在服务器中调用该模块。下面的附加和更新代码:

新的下载模块:

dlmodule <- function(input, output, session) {
  output$dlPlot <- downloadHandler(
    filename="Plot_Download.pdf",
    content=function(file){
      ggsave(file, device = pdf, width = 7,height = 5,units = "in",dpi = 200)
    }
  )
}

更新的服务器调用:
server <- function(input, output, session) {
  y <- callModule(mod, "input1")
  output$plot1 <- renderPlot({
    if (is.null(y$dat())) return()
    showPlot(data.frame(y$dat()), y$m(), y$s())
  })

  dl.y <- callModule(dlmodule, "input1")
}

其他一切都保持不变。

关于R Shiny downloadHandler 返回应用程序 html 而不是绘图或数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48432042/

相关文章:

r - 将文本变量添加到 ggplot 条形图中的每个条形簇

r - 如何在不指定x轴的情况下绘制箱形图?

r - 显示文本 font_add_google 中未加载字体

module - 看不懂 Rust 模块系统

r - 如何按名称调用 R 函数内的 data.frame

r - 矩阵 - 选择除指定索引以外的所有内容

R: lapply 函数 - 跳过当前函数循环

r - 如何使用 R 中的 dplyr 将数据框中的行与多列配对?

perl - 如何管理 Perl 模块依赖项?

C#如何从网络模块构建dll