импортировать файл, когда он не используется (больше не используется) - PullRequest
0 голосов
/ 31 октября 2018

У меня есть flexdashboard, который используется несколькими пользователями. Они читают, изменяют и пишут один и тот же (CSV) файл. Я не смог понять, как это сделать с помощью SQL-соединения, поэтому пока (мне нужно работающее приложение) я хотел бы использовать простой файл .csv в качестве базы данных. Это должно быть хорошо, так как пользователи вряд ли будут работать над ним в одно и то же время, а загрузка и запись полного файла практически мгновенны.

Поэтому моя стратегия такова:

1-файл загрузки,

2-edit (редактирование выполняется в rhandsontable, который обратно преобразован в фрейм данных)

3-сохранить: (а) - снова загружает файл (чтобы получить последние данные), (b) - добавляет правки из rhandsontable и сохраняет последние данные (отмеченные меткой времени) (С) -write.csv

Я думаю, что я должен добавить что-то в (1), чтобы он проверял, не используется ли файл / не открыт (потому что другой пользователь находится в (3). Итак: проверьте, открыт ли, если нет-> продолжайте, иначе-> sys.sleep (3) и попробуйте снова.

Есть идеи о том, как сделать это в R? В Delphi это было бы что-то вроде: если fileinuse (имя файла), тогда sleep (3) иначе df <-read.csv </p>

Какой путь R?

Ответы [ 2 ]

0 голосов
/ 05 ноября 2018

Интересный вопрос, действительно! Интересует элегантное решение тоже ...

0 голосов
/ 31 октября 2018

Редактировать:

Я начинаю с моего отредактированного ответа, так как он более элегантный. Это использует команду оболочки, чтобы проверить, доступен ли файл, как обсуждено в этом вопросе:

Как проверить в командной строке, заблокирован ли данный файл или каталог (используется каким-либо процессом)?

Это позволяет избежать загрузки и сохранения файла и поэтому является более эффективным.

# Function to test availability
IsInUse <- function(fName) {
  shell(paste("( type nul >> ", fName, " ) 2>nul && echo available || echo in use", sep=""), intern = TRUE)=="in use"
}

# Test availability
IsInUse("test.txt")

Оригинальный ответ:

Интересный вопрос! Я не нашел способа проверить, используется ли файл, прежде чем пытаться записать в него файл. Решение, приведенное ниже, далеко не элегантно. Он полагается на функцию tryCatch, а также на чтение и запись в файл, чтобы проверить, доступен ли он (который может быть довольно медленным в зависимости от размера вашего файла).

# Function to check if the file is in use (relies on reading and writing which is inefficient)
IsInUse <- function(fName) {
  rData <- read.csv(fName)
  tryCatch(
    {
      write.csv(rData, file=fName, row.names = FALSE)
      return(FALSE)
    },
    error=function(cond) { 
      return(TRUE)
    }
  )
}

# Loop to check if file is in use
while(IsInUse(fName)) {
  print("Still in use")
  Sys.sleep(0.1)
}
# Your action here

Я также нашел ответ на этот вопрос полезным Как написать trycatch в R , чтобы понять функцию tryCatch.

Мне было бы интересно узнать, есть ли у кого-нибудь еще более элегантное предложение!

...