2013-10-30 61 views
19

所以我试图做一个闪亮的应用程序,我有一个按钮,只有当文件已上传才显示;为即时通讯使用conditionalPanel。使条件面板依赖于与fileInput上传的文件

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,这两者导致该按钮是目前之前我上传的文件。我猜这是因为在选择文件之前,输入$ files是一个空的data.frame,因此具有非零长度/大小,是吗?

我可以用什么条件来隐藏按钮,直到至少有一个文件完成上传?

我认为另一个选择是用uiOutput取代conditionalPanel,并调用在renderUI({actionButton(...)})一个server.R观察/分离块,正在观看input.files(if (nrow(input$files) < 1) return())的内部;这是唯一的方法吗?如果我可以做到这一点,那么我会选择其中一种(超出conditionalPanel,导致代码减少)?

回答

30

您必须使无功输出返回上传状态,并将此输出的选项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", 
    ...... 
+1

啊哈,我甚至不知道'outputOptions()'存在!这是一个棘手的方法来'隐藏'你的'输出'列表中的东西,但它的作品。 – ClaytonJY

+2

看来有些东西已经改变了,现在必须做''output.fileUploaded == true“'。 –