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

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

そこで、ファイルがアップロードされた場合にのみ表示されるボタンを備えた魅力的なアプリを作成しようとしています。そのために、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"))
))

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

私の症状に対して試したことはinput.files.length > 0、、、input.files.size() > 0どちらもボタンが表示される結果になりました前にファイルをアップロードします。これは、ファイルを選択する前の input$files が空の data.frame であり、長さ/サイズがゼロではないためだと思いますが、正しいでしょうか?

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

conditionalPanel別の選択肢としては、を に置き換えて、 input.files() を監視している server.R の observe/isolate ブロック内で をuiOutput呼び出すことだと思います。それが唯一の方法でしょうか? どちらの方法でもこれを行うことができる場合、(コードが少なくなる以外に) どちらか一方を選択する理由は何でしょうか?renderUI({actionButton(...)})if (nrow(input$files) < 1) return()conditionalPanel

ベストアンサー1

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

より正確には、サーバー.RgetData()アップロードされたファイルからデータフレームを作成するなどのリアクティブ関数が確実にあるとします。次に、次のようにします。

  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",
   ......

おすすめ記事