首页 > 解决方案 > 我可以在闪亮的同一个表格单元格中放置多个下载链接吗?

问题描述

我正在使用闪亮的,我无法在同一个表格单元格中插入多个链接。每个链接都应允许用户下载在计算机上找到的本地文件。这是我的意思的图像: 带有链接的表

对于第 2、3 和 4 列,它们的行最多只包含 1 个链接,它工作得很好;当我点击超链接时,我可以从我的电脑下载相应的文件。但是,对于在每个单元格中包含多个超链接的第 5 列,我无法这样做。单击链接不会返回任何内容;没有下载文件(但我没有收到错误消息)。

这是我用于第 5 列的代码:

lapply(1:nrow(table), function(i) {
 if (table[i,5]!="No panels")
    {
      panels=strsplit(table[i,5], "<br>")
      panels=panels$`Gene panel`
      for (j in 1:length(panels)){
      output[[paste0("downloadData", i, j, 4)]] <- downloadHandler( # as opposed to before, I added here another variable 'j' in the name of the output variable to differentiate between the different panels for each sample name
        filename=paste("./Gene_panel/", table[i,1], "_", panels[j], sep=""),  
        content = function(file) {
          file.copy(paste("./Gene_panel/", table[i,1], "_", panels[j], sep=""), file)
        }
      )}}
    }
  )

output$hidden_downloads_panel <- renderUI(
    lapply(1:nrow(table), function(i) {
      if (table[i,5]!="No panels"){
      panels=strsplit(table[i,5], "<br>")
      panels=panels$`Gene panel`
      for (j in 1:length(panels)){
      downloadLink(paste0("downloadData", i, j, 4), "download", class = "hiddenLink") # also added 'j' here
      }
      }
    }))

  output$table <- renderDataTable({ # here, it's the same as before but I just added the last '%>% mutate' to accommodate the last column 'Gene panel'
    table=as.data.frame(table)%>%
      mutate("Quality Control" = lapply(1:n(),
                           function(i)
                           { if (table[i,2]=="Yes"){
                             paste0('<a href="#" onClick=document.getElementById("downloadData',i, 1,'").click() >Yes</a>')}
                             else 
                               paste0("No")}
      ))%>% mutate("BWA" = lapply(1:n(),
                                  function(i)
                                  { if (table[i,3]=="Yes"){
                                    paste0('<a href="#" onClick=document.getElementById("downloadData',i,2, '").click() >Yes</a>')}
                                    else 
                                      paste0("No")}))%>% mutate("Annotation" = lapply(1:n(),
                              function(i)
                              { if (table[i,4]=="Yes"){
                                paste0('<a href="#" onClick=document.getElementById("downloadData',i,3, '").click() >Yes</a>')}
                                else 
                                  paste0("No")}))%>% mutate("Gene panel" = lapply(1:n(),
                                     function(i)
     if (table[i,5]!="No panels"){
        panels=strsplit(table[i,5], "<br>")   
        panels=panels$`Gene panel`
        list=c()
        for (j in 1:length(panels))
        {
        list=append(list,paste0('<a href="#" onClick=document.getElementById("downloadData', i, j, 4, '").click() >', panels[j], '</a>')) 
        }
        paste0(list, collapse="<br>")
      }
    else
      paste0("No panels")                 
))
    table
  }, escape = F)

如果缺少某些内容或您需要进一步澄清,我在 rstudio 论坛上更详细地询问了这个问题(使用我的代码)(虽然没有收到答案):https ://community.rstudio.com/t/multiple -链接在同一个表单元格/110558

先感谢您。

标签: rshiny

解决方案


我认为这应该通过lapplyrenderUI部分中替换 for 循环并生成downloadLinkas a来做到这一点tagList

  output$hidden_downloads_panel <- renderUI({
outputlist <- lapply(1:nrow(table), function(i) {
  if (table[i,5]!="No panels"){
    panels=strsplit(table[i,5], "<br>")
    panels=panels[[1]]
    lapply(1:length(panels), function(j){
      tagList(
      downloadLink(paste0("downloadData", i, j, 4), "download", class = "hiddenLink")
      )
    })
      }
  })
})

并将downloadHandler输出放在本地环境中以使用 for 循环生成唯一 ID:

  lapply(1:nrow(table), function(i) {
if (table[i,5]!="No panels")
{
  panels=strsplit(table[i,5], "<br>")
  panels=panels[[1]]
  for (j in 1:length(panels)){
    local({
      my_j = j
    output[[paste0("downloadData", i, my_j, 4)]] <- downloadHandler( 
      filename=paste("./Gene_panel/", table[i,1], "_", panels[my_j], sep=""),  
      content = function(file) {
        file.copy(paste("./Gene_panel/", table[i,1], "_", panels[my_j], sep=""), file)
      }

    )
    })
    }}
})

我必须将您的panels=panels$"Gene panel"行替换panels=panels[[1]]为使其与我的测试数据框一起使用,我能够“显示”您的示例数据的 6 个隐藏链接。


推荐阅读