2

我有一个供多个用户使用的 flexdashboard。他们读取、修改和写入相同的 (csv) 文件。我无法弄清楚如何使用 SQL 连接来执行此操作,因此同时(我需要一个工作应用程序)我想使用一个简单的 .csv 文件作为数据库。这应该没问题,因为用户不太可能在同一时间处理它,并且加载和写入完整文件几乎是即时的。

因此,我的策略是:

1-加载文件,

2-编辑(编辑在 rhandsontable 中完成,它被反向转换为数据帧)

3-保存:(a)-再次加载文件(以获取最新数据),(b)-附加来自 rhandsontable 的编辑并保留最新数据(由时间戳指示)(c)-write.csv

我想我应该在 (1) 中添加一些内容,以便它检查文件是否尚未使用/打开(因为其他用户在 (3)。所以:检查是否打开,如果没有 -> 继续,否则-> sys.sleep(3) 然后再试一次。

关于如何在 R 中执行此操作的任何想法?在 Delphi 中,它类似于: if fileinuse(filename) then sleep(3) else df<-read.csv

什么是R方式?

4

2 回答 2

0

编辑:

我从我编辑的答案开始,因为它更优雅。这使用 shell 命令来测试文件是否可用,如本问题中所述:

如果给定文件或目录被锁定(由任何进程使用),如何检查命令行?

这避免了加载和保存文件,因此效率更高。

# 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

我还发现这个问题的答案很有用How to write trycatch in R to make sense of the tryCatch function。

我很想看看其他人是否有更优雅的建议!

于 2018-10-31T15:17:14.317 回答
-1

有趣的问题,确实!也对优雅的解决方案感到好奇......

于 2018-11-05T12:54:08.460 回答