web-dev-qa-db-ja.com

conditionPanelをfileInputでアップロードされたファイルに依存させる

そこで、ファイルがアップロードされた場合にのみ表示されるボタンがある光沢のあるアプリを作成しようとしています。このimの場合、conditionalPanelを使用します。

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"))
))
_

上記の例ではdo何も行われないため、server.Rには何も気にする必要はないと思います。上記の条件では、ボタンが表示されることはありません。つまり、条件が真になることはありません。

私が自分の状態に対して試したいくつかのことは、_input.files.length > 0_、input.files.size() > 0であり、どちらもボタンが表示されますbeforeファイルをアップロードします。これは、input $ filesがファイルを選択する前の空のdata.frameであり、長さ/サイズがゼロ以外であるためだと思います。

少なくとも1つのファイルのアップロードが完了するまで、ボタンを非表示にするにはどのような条件を使用できますか?

別のオプションは、conditionalPaneluiOutputに置き換え、input.filesを監視しているserver.Rのobserve/isolateブロック内でrenderUI({actionButton(...)})を呼び出すことだと思います(if (nrow(input$files) < 1) return());それが唯一の方法ですか?どちらの方法でもこれを実行できるとしたら、どちらを選択するのでしょうか(conditionalPanelを超えるとコードが少なくなります)。

29
ClaytonJY

アップロードのステータスを返すリアクティブ出力を作成し、この出力のオプションsuspendWhenHiddenFALSEに設定する必要があります。

より正確には、server.Rには、アップロードされたファイルからデータフレームを作成するためのgetData()などのリアクティブ関数があります。次に、これを行います。

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

そしてi.Rでは、次のようにしてconditionalPanel()を使用できます。

_conditionalPanel("output.fileUploaded",
   ......
_
41