使 conditionalPanel 依赖于使用 fileInput 上传的文件

Posted

技术标签:

【中文标题】使 conditionalPanel 依赖于使用 fileInput 上传的文件【英文标题】:Make conditionalPanel depend on files uploaded with fileInput 【发布时间】:2013-11-10 06:46:11 【问题描述】:

所以我正在尝试制作一个闪亮的应用程序,其中有一个按钮,该按钮仅在文件已上传时才会显示;为此我使用了条件面板。

ui.R:

require(shiny)
shinyUI(pageWithSidebar(
  headerPanel("My App"),

  sidebarPanel(
    fileInput("files", "Choose file"),
    conditionalPanel(
      condition = "input.files",
      actionButton("submitFiles", "Submit files for processing"))),

  mainPanel(h3("Nothing to see here"))
))

我认为在我的 server.R 中没有什么需要关心的,因为上面的示例没有任何事情。在上述条件下,按钮永远不会出现,即条件永远不会为真。

我为自己的情况尝试过的一些方法是input.files.length > 0input.files.size() > 0,这两种方法都会导致按钮出现我上传文件之前。我猜这是因为 input$files 在选择文件之前是一个空的 data.frame,因此长度/大小不为零,对吗?

在至少一个文件上传完成之前,我可以使用什么条件隐藏按钮?

我认为另一种选择是将conditionalPanel 替换为uiOutput,并在server.R 的观察/隔离块内调用renderUI(actionButton(...)),该块正在监视input.files (if (nrow(input$files) < 1) return());这是唯一的方法吗?如果我能以任何一种方式做到这一点,是什么让我选择其中一个(除了conditionalPanel 导致更少的代码)?

【问题讨论】:

【参考方案1】:

您必须创建一个响应式输出来返回上传状态,并将此输出的选项suspendWhenHidden 设置为FALSE

更准确地说,在 server.R 中你肯定有一个反应函数,比如getData() 来从上传的文件中创建一个数据框。然后这样做:

  getData <- reactive(
    if(is.null(input$files)) return(NULL)
    ......
  )
  output$fileUploaded <- reactive(
    return(!is.null(getData()))
  )
  outputOptions(output, 'fileUploaded', suspendWhenHidden=FALSE)

而在 ui.R 中,您可以通过以下方式使用 conditionalPanel()

conditionalPanel("output.fileUploaded",
   ......

【讨论】:

啊哈,我什至不知道outputOptions() 的存在!这是一种在output 列表中“隐藏”某些内容的棘手方法,但它确实有效。 似乎有些事情发生了变化,现在必须做"output.fileUploaded == true" 由于R中通常使用全大写TRUE,所以我觉得我应该指出"output.fileUploaded == true"中使用的小写true是正确的。

以上是关于使 conditionalPanel 依赖于使用 fileInput 上传的文件的主要内容,如果未能解决你的问题,请参考以下文章

Shiny pickerInput - conditionalPanel 仅将值设置为第一个选择

总是会出现闪亮的conditionalPanel

Shiny:基于 selectizeInput 的 conditionalPanel 问题

如何在 Shiny 的 ConditionalPanel 中将列表添加到隐藏的选项中?

conditionalPanel 和 uiOutput/req 模式之间的区别

如何使自动布局约束依赖于多个其他锚?