updateSelectInput操作顺序/竞争条件

时间:2015-04-15 13:27:26

标签: r shiny

我正在使用updateSelectInput使用目录中的文件名填充selectInput。用户使用radioButtons输入选择要填充的目录。一切正常,但是当首次加载应用程序或更改目录时,selectInput reactive会从旧目录传递默认值或最后选择的文件(分别用于启动和目录更改)。这会导致数据文件加载失败,直到selectInput更新为止。

如何让我的文件加载响应以等待selectInput更新?

以下是相关代码......

ui.R:

radioButtons("system", label = h3("System"),
             choices = list("USAMS" = usamspath, "CFAMS" = cfamspath),
             selected = usamspath),
selectInput("wheelSelect",
            label = h3("Wheel"),
            c("label 1" = "option1")),

server.R:

observe({
  #Get and order wheelnames
  details <- file.info(list.files(path = input$system,
                       pattern = "*AMS*.*", full.names=TRUE))
  details <- details[with(details, order(as.POSIXct(mtime))), ]
  wheels <- basename(rownames(details))

  # Change values for input$wheelSelect
  updateSelectInput(session, "wheelSelect",
                    choices = wheels,
                    selected = tail(wheels, n = 1))
  })

wheelData <- reactive({
  #Code to reload wheel when file changes
  wheelFile <- reactiveFileReader(1000, session,
                 paste(input$system, input$wheelSelect, sep = "/"),
                 read.delim, skip = 4, comment.char = "=")
  z <- wheelFile()
  mungeCFWheel(z)
})

问题是输入$ wheelSelect在由前面的observe()中的updateSelectInput更新之前被wheelData反应读取。

1 个答案:

答案 0 :(得分:1)

终于弄明白了。我不知道这是正确的修复还是黑客攻击,但使用闪亮的函数validate()来检查selectInput生成的文件名是否有效似乎有效。

将此添加到wheelData反应函数可以解决问题:

validate(
  need(file.exists(
    paste(input$system, input$wheelSelect, sep = "/")),
  message = FALSE)
)

使message = FALSE允许它以静默方式失败,直到selectInput生成有效的文件名。