32

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

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 > 0, input.files.size() > 0,这两者都会导致按钮在我上传文件之前出现。我猜这是因为 input$files 在选择文件之前是一个空的 data.frame,因此长度/大小不为零,对吗?

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

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

4

1 回答 1

48

您必须创建一个响应式输出来返回上传状态,并将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",
   ......
于 2014-02-03T19:05:57.443 回答