updateSelectInput 操作顺序/竞争条件

Posted

技术标签:

【中文标题】updateSelectInput 操作顺序/竞争条件【英文标题】:updateSelectInput order of operations/race condition 【发布时间】:2015-06-21 11:50:00 【问题描述】:

我正在使用目录中的文件名使用 updateSelectInput 填充 selectInput。用户使用 radioButtons 输入选择要填充的目录。一切正常,但是当第一次加载应用程序或更改目录时,selectInput 反应式传递默认值或旧目录中最后选择的文件(分别用于启动和目录更改)。这会导致数据文件加载失败,直到 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")),

服务器.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)
)

问题是 input$wheelSelect 在被前面的 observe() 中的 updateSelectInput 更新之前被 wheelData 响应式读取。

【问题讨论】:

【参考方案1】:

终于想通了。我不知道这是正确的修复方法还是 hack,但使用闪亮的函数 validate() 检查 selectInput 生成的文件名是否有效似乎有效。

将这个添加到 wheelData 反应函数中就可以了:

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

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

【讨论】:

以上是关于updateSelectInput 操作顺序/竞争条件的主要内容,如果未能解决你的问题,请参考以下文章

R Shiny - 我的观察函数(UpdateSelectInput)有啥问题?

R 用 updateSelectInput 反应闪亮

闪亮,observeEvent,updateSelectInput,输入重置

定期禁用 updateSelectInput()

用于多个输入的闪亮 updateSelectInput

观察事件中的R闪亮updateSelectInput不起作用