2015-04-15 4 views
0

Я заполняю selectInput с updateSelectInput, используя имена файлов из каталога. Пользователь выбирает, какой каталог будет заполняться с помощью входа radioButtons. Все работает, но когда приложение загружается или изменяется каталог, selectInput реактивно передает либо значение по умолчанию, либо последний выбранный файл из старого каталога (для запуска и изменения каталога соответственно). Это приводит к неудачной загрузке файла данных до тех пор, пока не будут выбраны selectInput.updateSelectВведите порядок операций/состояние гонки

Как я могу восстановить загрузку файла, чтобы дождаться обновления 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 получает, считываемых wheelData реактивная прежде чем он будет обновлен updateSelectInput в предыдущем наблюдении().

ответ

1

Наконец-то понял это. Я не знаю, является ли это правильным исправлением или взломом, но с помощью блестящей функции validate() проверить, работает ли имя файла, сгенерированное selectInput.

Добавление этого к реакционному функции wheelData делает трюк:

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

Making сообщение = FALSE позволяет потерпеть неудачу тихо, пока selectInput не создает действительное имя файла.

Смежные вопросы