在函数内渲染输出函数

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

我有一个下载处理程序(比如说 10 次),需要将其置于闪亮状态,如下所示。因此,我没有编写 10 次,而是编写了一个函数,以便在传递 3 个参数后,应该执行渲染函数

按钮1

output$downloadData_sec1 <- downloadHandler(
  filename = function() {
    paste(str_replace("title",pattern = " ", "_"), Sys.Date(), ".csv", sep="_")
  },
  content = function(file) {
    write.csv(display_data$asd, file)
  }
)

按钮2

output$downloadData_sec2 <- downloadHandler(
  filename = function() {
    paste(str_replace("title2",pattern = " ", "_"), Sys.Date(), ".csv", sep="_")
  },
  content = function(file) {
    write.csv(display_data$asd2, file)
  }
)

功能

download_function <- function (id, title, data){
output[["id"]] <- downloadHandler(
  filename = function() {
    paste(str_replace(title,pattern = " ", "_"), Sys.Date(), ".csv", sep="_")
  },
  content = function(file) {
    write.csv(display_data[["data"]], file)
  }
)
}

但是看起来这里有一些错误。我得到

output
未定义 有人可以帮我吗?

r shiny
1个回答
1
投票

这是一个 MWE,展示了如何将您的函数实现为 Shiny 模块。 为了简洁起见,我将自己限制为该模块的三个实例而不是十个。 我还在模块的每个实例中生成了随机数据。 您可以根据实际用例进行明显的更改。

library(shiny)

# Download UI
demoUI <- function(id) {
  ns <- NS(id)
  
  wellPanel(
    id,
    tableOutput(ns("data")),
    downloadButton(ns("downloadData"), "Download")
  )
}

# Download server
demoServer <- function(id, title) {
  moduleServer(
    id,
    function(input, output, session) {
      # Generate some random data
      d <- data.frame(X=runif(5), y=rnorm(5))
      
      output$data <- renderTable({ d })
      
      output$downloadData <- downloadHandler(
        filename = function() {
          paste(stringr::str_replace(title, pattern = " ", "_"), Sys.Date(), ".csv", sep="_")
        },
        content = function(file) {
          write.csv(d, file)
        }
      )
    }
  )
}

# Main UI
ui <- function() {
  fluidPage(
    demoUI("demo1"),
    demoUI("demo2"),
    demoUI("demo3")
  )
}


# Main server
server <- function(input, output, session) {
  demoServer("demo1", "Random title")
  demoServer("demo2", "Another title")
  demoServer("demo3", "Something else")
}

shinyApp(ui, server)

这是应用程序(部分)的屏幕截图:

enter image description here

单击每个下载按钮并接受默认文件名后,我的下载文件夹的一部分:

enter image description here

最后,其中一个 CSV 文件的内容:

enter image description here

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