我有一个Flexdashboard,可供多个用户使用。他们读取,修改和写入相同(csv)文件。我还无法弄清楚如何使用SQL连接来完成此操作,因此与此同时(我需要一个运行中的应用程序)我想使用一个简单的.csv文件作为数据库。这应该很好,因为用户不太可能在同一时间处理它,并且加载和写入完整文件几乎是即时的。
因此,我的策略是:
1次加载文件,
2-edit(编辑是在rhandsontable中完成的,然后将其反向转换为数据框)
3次保存: (a)重新加载文件(以获取最新数据), (b)-追加来自流变仪的编辑并保留最新数据(以时间戳表示) (c)-write.csv
我想我应该在(1)中添加一些内容,以便它检查文件是否尚未使用/打开(因为其他用户位于(3)。所以:请检查是否打开,如果不是->继续,否则-> sys.sleep(3),然后重试。
关于如何在R中执行此操作的任何想法?在Delphi中,它将类似于: 如果fileinuse(filename)则sleep(3)否则df <-read.csv
R的方式是什么?
答案 0 :(得分:0)
修改:
我从编辑后的答案开始,因为它更优雅。它将使用shell命令来测试文件是否可用,如该问题中所述:
How to check in command-line if a given file or directory is locked (used by any process)?
这避免了加载和保存文件,因此更加有效。
# 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很有用,有助于理解tryCatch函数。
我想看看是否还有其他人提出更优雅的建议!
答案 1 :(得分:-1)
确实是一个有趣的问题!也对一个优雅的解决方案感到好奇...