2013-10-30 63 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「'。 –