「R shiny 抓虫」为什么我的fileInput失效了?

本文记录了一次使用Shiny框架时遇到的文件上传问题及解决过程。作者在尝试使用fileInput组件上传文件时遇到了障碍,经过排查发现是由于两个具有相同outputId的downloadLink组件导致的。最终通过移除重复的downloadLink解决了问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

只有经历几个我得花好久才能找到的bug,我才觉得我有点会用Shiny了

今天在写Shiny 的时候遇到了几个巨大的问题,就是Shiny中一个组件fileInput无论如何都无法上传文件

2013053-b01de05ebda39995.png
fileinput

我在这个问题上花了差不多1个小时时间,其中大概做了如下几件事情:

  • 不断的进行代码注释,检查我新增代码块是否有问题
  • 重启电脑
  • 将代码放到另一台电脑上运行

直到问题的解决的一瞬间,我才认识到福尔摩斯的话是多么正确

当你排除所有的不可能,无论剩下的是什么,即使是不可能也一定是真相.

接下来,我就提供一个最简单的代码复现出我的问题。由于这是很最简洁代码了,相信大家应该能够比较容易发现错误

if (interactive()) {
  
  ui <- fluidPage(
    sidebarLayout(
      sidebarPanel(
        fileInput("file1", "Choose CSV File",
                  accept = c(
                    "text/plain",
                    ".vcf")
        ),
        tags$hr(),
        checkboxInput("header", "Header", TRUE)
      ),
      mainPanel(
        tableOutput("contents"),
        downloadLink("a",label = "Download"),
        downloadLink("a",label = "Download")
      )
    )
  )
  
  server <- function(input, output) {
  output$contents <- renderTable({
    # input$file1 will be NULL initially. After the user selects
    # and uploads a file, it will be a data frame with 'name',
    # 'size', 'type', and 'datapath' columns. The 'datapath'
    # column will contain the local filenames where the data can
    # be found.
    inFile <- input$file1

    if (is.null(inFile))
      return(NULL)

    read.csv(inFile$datapath, header = input$header)
  })

}
  
  shinyApp(ui, server)
}

我用动图演示下效果

2013053-57af4cecbc2cf869.gif
错误演示

下面是正确答案的分割线


文件无法上传的原因是下面这两行一模一样的代码。由于他们拥有相同的outputId, 其结果就是Shiny 没有解析出数据的输入和数据,结果导致Shiny的reactive体系无法正确调用server函数

        downloadLink("a",label = "Download"),
        downloadLink("a",label = "Download")

有了这个血泪教训,我想之后,我应该更会小心的处理inputIdoutputId了吧

我的一个好朋友果子老师经常说我成长很快,因为他们做一次实验的时间,我们的运算可以重复很多次。但是同样的,我们明天也要经历更多的失望。那些杀不死你的会让你更强大,所以我变秃了,也变强了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值